2

我有一个简单的 java 应用程序,它计算素数到某个用户给定的数字并打印出这些数字。我在此基础上添加了四个独立的线程,这些线程遍历了 4 个不同的数字范围。一旦所有 4 个线程都完成了它们的迭代,我想打印最终的 ArrayList。

我目前收到 ConcurrentModificationException ,因为在我启动 4 个线程后,下一行代码是 print 语句,它试图打印 ArrayList ,此时至少有一个仍处于活动状态的线程正在修改该 ArrayList 。

因此,我希望能够在所有 4 个线程都死后执行 print 语句。此外,我想在不使用旋转循环的情况下做到这一点。我没有特别反对使用旋转循环,除了我想有更好的方法可以做到这一点,我可能不得不为 4 个线程分配更大的优先级,以防止旋转循环用完大量的中央处理器。

4

3 回答 3

4

使用初始化为 4的CountDownLatch ;打印线程锁存器,并且工作线程在它们终止之前awaits调用锁存器。countdown

ArrayList如果四个线程同时修改它,请务必正确同步您的;您可能想改用ConcurrentLinkedQueue(或者ArrayList为每个线程使用不同的)

于 2013-05-21T03:07:38.600 回答
2

使用CountdownLatch. 该类的 Javadoc 告诉如何拥有

  1. 主线程使用线程数创建闩锁。
  2. 主线程启动所有工作线程。
    1. 每个线程都有一个对锁存器的引用。
    2. 它在完成工作时对锁存器进行计数。
  3. 主线程等待锁存器倒数到 0。
  4. 主线程执行打印工作。
于 2013-05-21T03:07:47.087 回答
0

如果您使用java.util.concurrent.BlockingQueue,则每个线程put()在完成时都可以在阻塞队列中添加一个项目。

在 print 语句之前,代码可以从阻塞队列中执行 a并且仅在每个线程返回一次take()时才继续。take()打印线程将在take()没有任何东西可以占用时阻塞。这将保证在所有线程完成之前不会开始打印。

于 2013-05-21T03:06:09.020 回答