我有两个线程。线程A正在从队列中拉出一些元素,线程B正在向队列中添加一些元素。Java线程等待并通知
我希望线程A在队列为空时进入睡眠状态。
当线程B将一些元素添加到队列中时,应确保线程A正在工作。这怎么能在Java中完成?
我有两个线程。线程A正在从队列中拉出一些元素,线程B正在向队列中添加一些元素。Java线程等待并通知
我希望线程A在队列为空时进入睡眠状态。
当线程B将一些元素添加到队列中时,应确保线程A正在工作。这怎么能在Java中完成?
使用一个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()将阻止前。)
请注意,这不是真正想要用于长寿命线程的东西。当你有一些你想要处理的短任务时更是如此。例如,如果你有一个线程从一个队列中拉取事件,然后对这些事件进行处理,那么从队列中拉取事件的线程可能不应该被合并,但它可能会使用线程池来执行任何操作同时处理每个事件。你永远不希望池中的线程等待某些东西,特别是在固定大小的池中。 – 2009-05-05 19:03:42
谢谢..我学会了一个新东西:) – 2009-05-05 18:10:56