我是java.util.concurrent
包的新手。我正在尝试写一些样本。
这是我的一些示例代码段:
for (MyTask task : tasks) {
Future<Boolean> result = task.getResult();
try {
if (result.isCancelled()) {
logger.info("processResults(): cancelled: "+ ((MyTask) task).getName());
} else if (result.get() == false) {
logger.info("processResults(): Failed : "+ ((MyTask) task).getName());
} else {
logger.info("processResults(): successful: "+ ((MyTask) task).getName());
tasks.remove(task);
continue;
}
} catch (Exception e) {
logger.warn("processResults(): Excepiton: " + e.getMessage());
}
}
我有一个关于从工作线程处理Future对象的问题。在我的for循环中,任务的处理顺序进行;比方说,我需要处理工作线程的返回结果,如果我的第二个工作线程在第一个工作线程之前完成,在我的代码中就没有办法先处理第二个工作线程。
任何人都可以提出处理当前问题的最佳方法。
谢谢, Venkat Papana
答案 0 :(得分:3)
这是使用生产者 - 消费者模式的经典案例:让任务(生产者)将他们的结果放在队列中并让“下一步”代码(消费者)从队列中获取结果并继续工作。 / p>
ArrayBlockingQueue将是一个不错的选择。第二组工作线程在队列块上调用take()
,直到某些内容可用(当您的第一步线程在队列上调用put()
时)。
答案 1 :(得分:1)
问题听起来适合java.util.concurrent.CompletionService
CompletionService的目的是将任务的生产与消费这些任务的结果分开。
结果使用者可以与任务生成者位于同一个线程中,但不一定是。
答案 2 :(得分:0)
如果您想在任务完成后立即执行某些工作,则可以在同一个线程中执行此操作。即将任务更改为执行所有操作,并在完成所有操作后返回值。
答案 3 :(得分:0)
这似乎是Java NIO (Non-blocking IO)的工作。 This article来自Java 1.4,但仍然可以让您很好地理解如何设置NIO。从那时起,NIO已经发展了很多,您可能需要查找Java 6或Java 7的API,以了解最新信息。