繁体   English   中英

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

[英]Java Concurrency: how to get the worker thread's response asynchronously

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

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

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

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

CompletionService的目的是将任务的生成与消耗这些任务的结果分开。

结果使用者可以与任务生成者位于同一个线程中,但不一定如此。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM