1

我是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 循环中,任务的处理是按顺序进行的;可以说,我需要处理来自工作线程的返回结果,如果我的第二个工作线程在第一个工作线程之前完成,那么在我的代码中没有办法先处理第二个工作线程。

任何人都可以建议处理当前线程的最佳方法。

谢谢,文卡特帕帕纳

4

4 回答 4

3

这是使用生产者-消费者模式的经典案例:让任务(生产者)将其结果放入队列,并让“下一步”代码(消费者)从队列中获取结果并继续工作。

ArrayBlockingQueue 将是一个不错的选择。第二组工作线程调用take()队列阻塞,直到有东西可用(当你的第一步线程调用put()队列时)。

于 2011-08-27T09:56:25.917 回答
1

这个问题听起来是为java.util.concurrent.CompletionService量身定做的

CompletionService 的目的是将任务的生产与这些任务的结果的消费分离。

结果消费者可以与任务生产者在同一个线程中,但并非必须如此。

于 2011-09-29T12:08:12.723 回答
0

如果您想在任务完成后立即执行一些工作,您可以在同一个线程中执行此操作。即更改任务以执行所有操作,并在所有操作完成让它返回一个值。

于 2011-08-27T08:23:02.643 回答
0

这似乎是Java NIO (Non-blocking IO)的工作。 本文来自 Java 1.4,但仍会让您很好地了解如何设置 NIO。从那时起,NIO 已经发展了很多,您可能需要查找Java 6Java 7的 API以了解新功能。

于 2011-08-27T09:19:47.480 回答