2009-05-05 143 views
10

我有两个线程。线程A正在从队列中拉出一些元素,线程B正在向队列中添加一些元素。Java线程等待并通知

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

当线程B将一些元素添加到队列中时,应确保线程A正在工作。这怎么能在Java中完成?

回答

21

使用一个BlockingQueue,它是:

Queue支持两个附加等待获取元素时队列变为非空,并等待空间在队列中存储时变得可用的操作一个元素。

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




(如果你必须使用等待/通知,读this tutorial但饶了自己的痛苦,请!)

+0

谢谢..我学会了一个新东西:) – 2009-05-05 18:10:56

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()将阻止前。)

+0

请注意,这不是真正想要用于长寿命线程的东西。当你有一些你想要处理的短任务时更是如此。例如,如果你有一个线程从一个队列中拉取事件,然后对这些事件进行处理,那么从队列中拉取事件的线程可能不应该被合并,但它可能会使用线程池来执行任何操作同时处理每个事件。你永远不希望池中的线程等待某些东西,特别是在固定大小的池中。 – 2009-05-05 19:03:42