Jos*_*cki 13 java multithreading threadpool
我有一个ExecutorService管理一些Callables.Callables运行的任务主要是黑盒转换和数字运算.在某些条件下,正在转换的数据将会振荡并且线程将花费一个多小时来完成.为了比较,大多数线程在一分钟内完成.
已经发现,长时间运行的线程中的数据并不相关.我想打断任何运行时间超过一定时间的线程.最好的方法是什么?
Pet*_*rey 21
taskFuture.cancel(true)在达到超时时,使用ScheduleExecutorService将任务计划到长时间运行的任务.如果任务在此之前完成,则不会取消.
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;
}
Run Code Online (Sandbox Code Playgroud)
您可以像在其他答案中一样取消未来等,但是您需要确保"数字运算"的线程可以处理中断并正常终止.你说这是一个黑盒子操作 - 你是否确定在黑盒子里主动检查线程的中断状态?如果不是,则无法通过中断取消.黑盒子需要记住中断.
执行此操作的最佳方法是再引入一个 Executor。您可以使用 ScheduledExecutorService 取消所有长时间运行的任务,例如:
ExecutorService service = Executors.newFixedThreadPool(N);
ScheduledExecutorService canceller = Executors.newScheduledThreadPool(1);
public void executeTask(Callable<?> c){
final Future<?> future = service.submit(c);
canceller.schedule(new Runnable(){
public void run(){
future.cancel(true);
}
}, SECONDS_UNTIL_TIMEOUT, TimeUnit.SECONDS);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8350 次 |
| 最近记录: |