【问题标题】:Multitheading blocking worker threads多线程阻塞工作线程
【发布时间】:2013-03-30 23:29:04
【问题描述】:

我有 4-5 个工作线程处理大型消息队列。而且我还有另一段代码使用 2-3 个工人运行。我想在处理大型消息队列时阻止所有其他工作人员。

我使用的是 JDK 6 和 Jms

编辑:

队列进程工作者从未终止。当没有消息时,他们阻塞在队列中。这些工人由执行线程池管理。如果我使用读写锁,这些工人之一也会被阻塞。 此外,如果使用循环屏障,那么我必须终止线程以释放阻塞的第二个进程。由于工作线程由线程池管理,因此不能保证所有工作线程都会忙于处理消息。

告诉我,

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new MessageWorker(qConn));
}

以下是第二个模块,我希望在队列处理器工作线程工作时阻止所有工作人员。

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new DbUpdateWorker());
}

【问题讨论】:

  • 在这种情况下您可以使用ReadWriteLock。让所有小型消息处理器锁定读取锁,让大型消息队列处理器锁定写入。不过不太合适。

标签: java multithreading


【解决方案1】:

您需要使用CyclicBarrier

一种同步辅助工具,它允许一组线程相互等待以达到一个共同的障碍点。 CyclicBarriers 在涉及固定大小的线程组的程序中很有用,这些线程组必须偶尔相互等待。屏障被称为循环的,因为它可以在等待线程释放后重新使用。

用作:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);

其中runnable 是您想要在工作线程完成时调用的Runnable。每个线程在完成时调用barrier.await()

【讨论】:

  • @apg 你几乎可以肯定这里的设计很糟糕。不应该真的有长时间运行的工作线程;使用线程池。
  • 我正在使用如上图所示的线程池。并且线程正在锁定 jms 队列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多