java - ExecutorService 对单个线程的时间限制

标签 java multithreading threadpool

我有一个 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/

相关文章:

c - 联锁操作和与 _aligned_malloc 对齐

java - 我不知道这个线程有什么问题,我想了解多线程

java - 如何从java中的字符串中获取Good CRC16?

java - 解压缩文件夹并选择特定文件夹并再次压缩

c++ - Windows API 线程池简单示例

java - 使用大量并发的 SwingWorker

.net - 在高处理器使用率下的WCF和线程池响应能力

java - java中的URL替换

c++ - 有没有更好的方法使这段代码线程安全? Thread_local static 似乎是一个生硬的工具

java - 如何阻塞和解除阻塞 servlet 线程?