Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程阻塞工作线程_Java_Multithreading - Fatal编程技术网

Java 多线程阻塞工作线程

Java 多线程阻塞工作线程,java,multithreading,Java,Multithreading,我有4-5个工作线程处理大型消息队列。我还有另一段代码,它使用2-3个worker运行。我想在处理大型消息队列时阻止所有其他工作进程 我正在使用JDK 6和Jms 编辑: 队列进程工作人员从未终止。当没有消息时,他们阻塞了队列。这些工作线程由executor线程池管理。如果我使用读写锁,其中一个工作线程也将被阻止。 另外,如果使用循环屏障,那么我必须终止线程,以释放阻塞的第二个进程。由于工作线程由线程池管理,所以不能保证所有工作线程都将忙于处理消息 让我知道 final ExecutorServ

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

我正在使用JDK 6和Jms

编辑:

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

让我知道

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new MessageWorker(qConn));
}
final executor服务executor=getexecutomanager().getExecutor();
对于(int i=0;i
下面是第二个模块,我希望在队列处理器工作线程工作时阻止所有工作线程

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new DbUpdateWorker());
}
final executor服务executor=getexecutomanager().getExecutor();
对于(int i=0;i
您需要使用

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

用作:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);
其中,
runnable
是工作线程完成时要调用的
runnable
。每个线程在完成后调用barrier.await()

您需要使用

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

用作:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);

其中,
runnable
是工作线程完成时要调用的
runnable
。完成后,每个线程调用barrier.await()

在这种情况下,您可以使用
ReadWriteLock
。让所有的小消息处理器锁定读锁和大消息队列处理器的写锁。不过不太合适。在这种情况下,您可以使用
ReadWriteLock
。让所有的小消息处理器锁定读锁和大消息队列处理器的写锁。虽然不太合适。@apg您几乎可以肯定这里的设计很差。不应该真的有长时间运行的工作线程;使用线程池。我使用的线程池如上所示。而且线程在jms队列上锁定。@apg您几乎可以肯定这里的设计很差。不应该真的有长时间运行的工作线程;使用线程池。我使用的线程池如上所示。线程在jms队列上锁定。