【发布时间】:2009-05-05 18:02:51
【问题描述】:
我有两个线程。线程 A 正在从队列中提取一些元素,线程 B 正在向队列中添加一些元素。
我希望线程 A 在队列为空时进入睡眠状态。
当线程 B 向队列中添加一些元素时,它应该确保线程 A 正在工作。如何在 Java 中做到这一点?
【问题讨论】:
标签: java multithreading queue producer-consumer
我有两个线程。线程 A 正在从队列中提取一些元素,线程 B 正在向队列中添加一些元素。
我希望线程 A 在队列为空时进入睡眠状态。
当线程 B 向队列中添加一些元素时,它应该确保线程 A 正在工作。如何在 Java 中做到这一点?
【问题讨论】:
标签: java multithreading queue producer-consumer
使用BlockingQueue,即:
Queue还支持在检索元素时等待队列变为非空的操作,以及在存储元素时等待队列中可用空间的操作。
说真的,不要试图在这里重新发明轮子。
(如果您必须使用等待/通知,请阅读this tutorial。但请不要让自己痛苦!)
【讨论】:
这里有一些细节:
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() 的线程将阻塞之前具有最大大小的队列。)
【讨论】: