【发布时间】:2012-11-05 16:40:12
【问题描述】:
这就是我所拥有的...我有一个任务列表,每个任务都将单独提交ExecutorService。我希望每个任务在开始执行后都有一个 x MS 的时间限制。我已经看到了类似Time Limit on Individual Threads 上发布的解决方案,但这对提交任务时开始设置了时间限制。
我认为一种解决方案可以将已接受的解决方案扩展到Time Limit on Individual Threads。这会将Callable 包装在另一个Callable 中,一旦它开始就会将取消任务放在计划的执行程序上。这将涉及以非平凡的方式将Callable 映射到Future,所以我想我会发帖看看是否有人知道现有的解决方案(代码重用是一件很棒的事情)。
谢谢。
作为仅供参考,Time Limit on Individual Threads 发布的解决方案如下。这再次从提交时间取消,而不是开始时间:
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 concurrency executorservice