Java Concurrency:如何异步获取工作线程的响应

时间:2011-08-27 07:58:19

标签: java java.util.concurrent

我是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

4 个答案:

答案 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 6Java 7的API,以了解最新信息。