的确使用
ExecutorService而不是来代替
Timer,这是SSCCE:
package com.stackoverflow.q2275443;import java.util.concurrent.Callable;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;public class Test { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new Task()); try { System.out.println("Started.."); System.out.println(future.get(3, TimeUnit.SECONDS)); System.out.println("Finished!"); } catch (TimeoutException e) { future.cancel(true); System.out.println("Terminated!"); } executor.shutdownNow(); }}class Task implements Callable<String> { @Override public String call() throws Exception { Thread.sleep(4000); // Just to demo a long running task of 4 seconds. return "Ready!"; }}timeout在
Future#get()方法中使用参数,例如将其增加到5,你将看到线程完成。你可以在catch
(TimeoutException e)块中拦截超时。
更新:澄清一个概念的误解,将
sleep()是不必需的。它仅用于SSCCE /演示目的。只要做你的长时间运行的任务就在那里发生的
sleep()。在长时间运行的任务中,应检查线程是否未中断,如下所示:
while (!Thread.interrupted()) { // Do your long running task here.}


