multithreading - Java:对从异步任务检索的结果进行排序

标签 multithreading java

我有一个计算(CTR 加密),需要精确顺序的结果。

为此,我创建了一个多线程设计来计算所述结果,在本例中,结果是 ByteBuffer。当然,计算本身是异步运行的,因此结果可以随时以任何顺序提供。 “用户”是一个单线程应用程序,它通过调用一个方法来使用结果,之后通过所述方法将 ByteBuffer 返回到资源池 - 资源的管理已经处理完毕(使用线程安全堆栈)。

现在的问题是:我需要一些东西来聚合结果并使其按正确的顺序可用。如果下一个结果不可用,则用户调用的方法应阻塞,直到下一个结果可用为止。有谁知道 java.util.concurrent 中可以按顺序返回异步计算结果的好策略或类吗?

解决方案必须是线程安全的。我想避免使用第三方库、Thread.sleep()/Thread.wait() 以及除“synchronized”之外的主题相关关键字。此外,任务可以分配给例如如果需要的话,以正确的顺序执行执行者。这是为了研究,所以请随意使用 Java 1.6 甚至 1.7 构造。

注意:我已经标记了这些问题 [jre] 因为我想保留在 JRE 和 [加密] 中定义的类中,因为有人可能已经不得不处理它,但问题本身纯粹是关于 java &多线程。

最佳答案

使用executors framework :

ExecutorService executorService = Executors.newFixedThreadPool(5);
List<Future> futures = executorService.invokeAll(listOfCallables);
for (Future future : futures) {
   //do something with future.get();
}
executorService.shutdown();

listOfCallables将是 List<Callable<ByteBuffer>>您构建的用于操作数据的。例如:

list.add(new SubTaskCalculator(1, 20));
list.add(new SubTaskCalculator(21, 40));
list.add(new SubTaskCalculator(41, 60));

(任意数字范围,根据您手头的任务进行调整)

.get()阻塞直到结果完成,但同时其他任务也在运行,所以当你到达它们时,它们的 .get()将会准备就绪。

关于multithreading - Java:对从异步任务检索的结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553740/

相关文章:

.net - .net:线程调试

java - 使用 Guava Reflection 引用私有(private)字段

java - 哪个性能更好?在 Java 中使用 .properties 文件或 .conf 文件?

java - Spring Security 身份验证失败 : error org. hibernate.HibernateException:未找到当前线程的 session

c++ - 为什么在所有 5 个线程都为多线程 C++ 餐饮哲学家之谜运行后,我只得到线程 # 0 的无限循环

linux - 挂起和恢复线程

java - 用于管理动态属性集的 JMX MBean

Java:将 char[] 转换为 CharSequence

java - Alloy API 导致 java.lang.UnsatisfiedLinkError

java - Java 中阻塞 main 方法总是不好吗?