ExecutorService对各个线程的时间限制

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)


dog*_*ane 6

您可以像在其他答案中一样取消未来等,但是您需要确保"数字运算"的线程可以处理中断并正常终止.你说这是一个黑盒子操作 - 你是否确定在黑盒子里主动检查线程的中断状态?如果不是,则无法通过中断取消.黑盒子需要记住中断.


Joh*_*int 5

执行此操作的最佳方法是再引入一个 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)