【发布时间】:2012-04-19 08:53:24
【问题描述】:
我想在固定时间后中断一个线程。其他人问了同样的问题,票数最高的答案 (https://stackoverflow.com/a/2275596/1310503) 给出了下面的解决方案,我稍微缩短了。
import java.util.Arrays;
import java.util.concurrent.*;
public class Test {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new Task()), 2, TimeUnit.SECONDS);
executor.shutdown();
}
}
class Task implements Callable<String> {
public String call() throws Exception {
try {
System.out.println("Started..");
Thread.sleep(4000); // Just to demo a long running task of 4 seconds.
System.out.println("Finished!");
} catch (InterruptedException e) {
System.out.println("Terminated!");
}
return null;
}
}
他们补充说:
sleep() 不是必需的。它仅用于 SSCCE/演示目的。只需在此处代替 sleep() 执行长时间运行的任务即可。
但是如果你用for (int i = 0; i < 5E8; i++) {} 替换Thread.sleep(4000); 那么它不会编译,因为空循环不会抛出一个InterruptedException。为了使线程可中断,它需要抛出一个 InterruptedException。
有什么方法可以使上述代码与一般长时间运行的任务而不是sleep() 一起工作?
【问题讨论】:
标签: java concurrency timeout