【发布时间】:2019-04-11 07:00:12
【问题描述】:
我正在创建一个ExecutorService 来执行一些在正常情况下预计需要一分钟才能完成的任务,但在任何情况下都不应允许运行超过两分钟从任务开始 /em>。
我的代码如下:
ExecutorService executorService = Executors.newFixedThreadPool(10);
ArrayList<Future<?>> futuresList = new ArrayList<Future<?>>();
for (String singleTask: taskList) {
futuresList.add(executorService.submit( new Runnable(){
@Override
public void run(){
try {
performTask(p1, singleTask, p3);
} catch (IOException | InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}));
}
for(Future<?> future : futures) {
future.get(120, TimeUnit.SECONDS);
}
这将阻塞直到指定超时,然后继续。我的问题如下:
1) 如果task1 阻塞了两分钟,task2 也阻塞了两分钟 - 那么 task2 将“阻塞”总共 4 分钟(因为直到 @ 987654327@ 完成阻塞) - 即使两个任务同时提交并开始执行
2) 如果我提交的任务超过 10 个,任务 11+ 可能永远不会阻塞所需的时间,如果之前的任务在 11 日调用 future.get(120, TimeUnit.SECONDS); 时还没有完成任务
我的目标是让每个单独的任务最多执行两分钟,不管列表中有多少任务,也不管它之前或之后有多少任务。
谢谢
【问题讨论】:
-
你可以使用
SingleThreadedExecutor -
@Ivan,他不能 - 他仍然需要线程池来执行任务。
-
你打算如何处理运行超过超时时间的任务?您将如何取消任务或将其超时?看起来你需要在
performTask中有一些自定义超时挂钩之王。 -
@tsolakp,我们的系统中运行着同样的事情——它需要一个自定义的工作线程实现,以及一个单独的看门狗线程,在指定的超时后唤醒并尝试杀死线程,如果它挂了。我觉得要添加到答案中是一件很长的事情。你觉得我的描述就够了?
-
@M.普罗霍罗夫。同意。 OP 很可能需要自定义超时或线程终止实现。
标签: java multithreading concurrency executorservice executor