用 concurrent 包控制 Java 线程的超时

jopen 12年前

这里使用JDK5+的java.util.concurrent包下的API实现,采用这种方式是相对比较安全的。

实现效果:

启动一个任务,然后等待任务的计算结果同时设定一个超时时间,如果等待时间超出预设定的超时时间,则中止任务。

代码实现:

import java.util.concurrent.Callable;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.Future;  import java.util.concurrent.TimeUnit;  import java.util.concurrent.TimeoutException;    /**   * 启动一个任务,然后等待任务的计算结果,如果等待时间超出预设定的超时时间,则中止任务。   *    * @author Chen Feng   */  public class TaskTimeoutDemo {     public static void main(String[] args) {    System.out.println("Start ...");      ExecutorService exec = Executors.newCachedThreadPool();      testTask(exec, 15); // 任务成功结束后等待计算结果,不需要等到15秒    testTask(exec, 5); // 只等待5秒,任务还没结束,所以将任务中止      exec.shutdown();    System.out.println("End!");   }     public static void testTask(ExecutorService exec, int timeout) {    MyTask task = new MyTask();    Future<Boolean> future = exec.submit(task);    Boolean taskResult = null;    String failReason = null;    try {     // 等待计算结果,最长等待timeout秒,timeout秒后中止任务     taskResult = future.get(timeout, TimeUnit.SECONDS);    } catch (InterruptedException e) {     failReason = "主线程在等待计算结果时被中断!";    } catch (ExecutionException e) {     failReason = "主线程等待计算结果,但计算抛出异常!";    } catch (TimeoutException e) {     failReason = "主线程等待计算结果超时,因此中断任务线程!";     exec.shutdownNow();    }      System.out.println("\ntaskResult : " + taskResult);    System.out.println("failReason : " + failReason);   }  }    class MyTask implements Callable<Boolean> {     @Override   public Boolean call() throws Exception {    // 总计耗时约10秒    for (int i = 0; i < 100L; i++) {     Thread.sleep(100); // 睡眠0.1秒     System.out.print('-');    }    return Boolean.TRUE;   }  }
运行结果:
Start ...  ----------------------------------------------------------------------------------------------------  taskResult : true  failReason : null  -------------------------------------------------  taskResult : null  failReason : 主线程等待计算结果超时,因此中断任务线程!  End!
来:http://www.blogjava.net/jialisoftwo/archive/2013/03/29/397156.html