我有一个 ExecutorService 管理多个 Callable。 Callables 运行的任务主要是黑盒转换和数字运算。在某些情况下,正在转换的数据会发生振荡,线程将需要一个多小时才能完成。相比之下,大多数线程在一分钟内完成。
已确定来自长时间运行的线程的数据不相关。我想中断任何运行时间超过一定时间的线程。执行此操作的最佳方法是什么?
最佳答案
使用 ScheduleExecutorService 将任务安排到 taskFuture.cancel(true)
达到超时时长时间运行的任务。如果任务在此之前完成,则不会取消。
ExecutorService service = Executors.newFixedThreadPool(N);
ScheduledExecutorService canceller = Executors.newSingleThreadScheduledExecutor();
public <T> Future<T> executeTask(Callable<T> c, long timeoutMS){
final Future<T> future = service.submit(c);
canceller.schedule(new Callable<Void>(){
public Void call(){
future.cancel(true);
return null;
}
}, timeoutMS, TimeUnit.MILLI_SECONDS);
return future;
}
关于java - ExecutorService 对单个线程的时间限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4819855/