使用执行器服务对单个线程的时间限制

2022-09-03 09:33:28

我有一个执行器服务来管理许多可调用的。Callables运行的任务主要是黑匣子转换和数字运算。在某些情况下,正在转换的数据将振荡,线程将需要一个多小时才能完成。相比之下,大多数线程在一分钟内完成。

已经阻止了来自长时间运行的线程的数据不相关。我想中断任何运行时间超过一定时间的线程。最好的方法是什么?


答案 1

使用 ScheduleExecutor服务在达到超时时将任务计划给长时间运行的任务。如果任务在此之前完成,则不会取消。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;
}

答案 2

您可以像其他答案一样取消未来等,但是您需要确保“数字运算”的线程可以处理中断并优雅地终止。您说这是一个黑匣子操作 - 您有多大确定在黑匣子中主动检查线程的中断状态?如果不是,则无法通过中断将其取消。黑匣子在编写时需要牢记中断。