Java线程等待并通知

时间:2009-05-05 18:02:52

标签: java multithreading queue producer-consumer

我有两个主题。线程A从队列中提取一些元素,线程B将一些元素添加到队列中。

我希望线程A在队列为空时进入休眠状态。

当线程B向队列添加一些元素时,应该确保线程A正在工作。如何在Java中完成?

2 个答案:

答案 0 :(得分:21)

使用BlockingQueue,即:

  

一个Queue,它还支持在检索元素时等待队列变为非空的操作,并在存储元素时等待队列中的空间可用。

说真的,不要试图在这里重新发明轮子。




(如果你必须使用wait / notify,请阅读this tutorial。但是请为自己省去痛苦!)

答案 1 :(得分:2)

以下是一些细节:

import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();

Java的更新的线程功能就是它的全部。 Executor是一个包含someNumberOfThreads的线程池。它由阻塞队列提供。除非有工作要做,否则所有线程都会休眠。使用execute()方法将Runnable对象推入队列时,Runnable对象位于队列中,直到有可用于处理它的线程。然后,调用run()方法。最后,shutdownNow()方法通知池中的所有线程都要关闭。

现在比过去简单得多。

(对此有很多变化,例如具有最小和最大线程数的池,或者在调用execute()的线程阻塞之前具有最大大小的队列。)