小编典典

Java并行处理;需要建议,例如在Runnanble / Callable接口上

java

假设我有一组对象需要用两种不同的方式进行分析,这两种方法都需要花费较长的时间并且涉及IO调用,所以我试图弄清楚如何/是否可以优化软件的这一部分。
,尤其是利用多个处理器(我以前使用的机器是8核i7,执行期间几乎永远不会超过10%的负载)。

我对并行编程或多线程技术还很陌生(不确定什么是正确的术语),因此我已经阅读了一些先前的问题,尤其是关注投票率高和信息量大的答案。我也正在阅读有关并发性Oracle
/ Sun教程

到目前为止,这就是我的想法。

  • 线程安全的集合保存要分析的对象
  • 一旦集合中有对象(它们通过一系列查询一次出现),则每个对象启动一个线程
  • 每个特定的线程都负责初始的分析前准备工作;然后调用分析。
  • 这两个分析被实现为Runnables / Callables,因此在必要时由线程调用。

我的问题是:

  1. 这是一个合理的计划吗?如果不是,您将如何进行呢?
  2. 为了确保事情不会失控,我应该实现一个ThreadManager或类似的东西来启动和停止线程,并在线程完成时重新分配它们吗?例如,如果我有256个要分析的对象,总共16个线程,则ThreadManager会将第一个完成的线程分配给要分析的第17个对象,依此类推。
  3. 除了Callable可以返回结果这一事实之外,Runnable / Callable之间是否还有显着差异?否则,我应该尝试实现自己的接口,为什么?

谢谢,


阅读 220

收藏
2020-11-01

共1个答案

小编典典

  1. 您可以使用BlockingQueue实现来保存对象并从那里生成线程。该接口基于 生产者-消费者 原则。该认沽() ,直到有更多空间和方法将阻塞,如果你的队列已满取()如果直到有一些在队列中再次对象队列为空方法将阻塞。

  2. 一个ExecutorService的可以帮助你管理你的线程池。

  3. 如果您正在等待生成的线程的结果,那么可以使用 Callable 接口是一个好主意,因为您可以更早地开始计算,并以 Future -s中的结果来处理代码。至于与 Runnable 接口的区别,请 参见 Callable javadoc

Callable接口与Runnable相似,两者均适用于其实例可能由另一个线程执行的类。 但是,Runnable不会返回结果,也不能引发已检查的异常。

在寻求Java并发性时需要考虑的一些常规事项:

  • 事实 并非凭空而来。 volatileAtomicReferencejava.util.concurrent.atomic 软件包中的其他对象是您的朋友。
  • 您需要使用同步和锁定来仔细确保复合操作的 原子性
2020-11-01