首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中共享用于并行处理的对象列表?

如何在Java中共享用于并行处理的对象列表?
EN

Stack Overflow用户
提问于 2016-05-31 07:23:37
回答 5查看 1.3K关注 0票数 0

我有一个必须在多个线程之间共享的对象列表。

例如,我有一个5个离散对象和一个由20个线程组成的池。首先,20个线程中的5个将开始工作,其他线程处于等待状态。5个线程将同时使用5个对象中的每一个。

如果完成了任何一个线程,就应该释放对象,这样第6个线程就可以开始工作了。

对于线程的并行处理,我想我可以使用Executor池。但是如何在线程之间共享对象列表呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-05-31 07:38:31

我想你的线程模型弄错了。目前,您希望在并行环境中总是出错的share。您应该做的是创建一个pipeline。要做到这一点,您有几种选择。

  1. 使用(阻塞/并发)队列在线程之间传递对象。在此场景中,管道的每个阶段都有固定数量的工作线程,这些线程总是在运行并共享队列。一方面是producer线程,当它们完成对队列的put()对象,然后其中一个consumer线程take()对象并开始处理它。
  2. 使用threadpool充当(1)中的队列。不是对共享队列执行put(),而是对共享线程池或专用线程池执行submit()/execute(),以将对象传递到管道的下一阶段。这种方法的缺点是,当前阶段必须知道提交任务的确切池,还必须知道如何创建要提交的runnable

PS:在我的回答中,我假设Thread-6执行的操作与前面的5个线程不同。如果这个假设是错误的--解决(1)仍然是正确的,是前进的方向。

票数 2
EN

Stack Overflow用户

发布于 2016-05-31 07:37:43

您可以定义要并行运行的线程数。例如,

代码语言:javascript
复制
ExecutorService executor = Executors.newFixedThreadPool(20);

然后,您可以编写一个for循环来处理对象列表。

代码语言:javascript
复制
for(Object obj: objList) {
    Runnable thread = new MyThreadImpl(obj);
    executor.execute(thread);
}

这应该可以很好的按照你的

票数 1
EN

Stack Overflow用户

发布于 2016-05-31 07:49:40

在我看来,你说的是对象池模式。对象池是包含指定数量的对象的容器。当一个对象从池中取出时,在返回之前它在池中是不可用的。

在以下情况下,应使用池:

  • 同一对象的高频使用
  • 对象非常大,占用了大量内存。
  • 对象需要大量时间进行初始化。
  • 对象使用大量的IO操作(流、套接字、数据库等)
  • 对象不是线程安全的。

有些发布不建议使用对象池,特别是对于只使用内存且不保存外部资源的对象。相关批评问题

取决于你为什么需要这个模式。这是Java实现

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37539340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档