2012-09-15 106 views
1

我有一个线程在后台工作,但它并不总是有工作要做。我希望它等待主线程传递的数据,然后继续工作。Java Worker线程等待

起初我以为这就是wait()notify()是为了,但它似乎反其道而行。

我该怎么做?

+2

听起来像是你想有一个['BlockingQueue'(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html) - 这是一个对生产者 - 消费者问题非常普遍的要求。尽量不要重新发明轮子;-) – oldrinb

+0

不知道这一个。作为一个答案,我会接受它); – Pijusn

+0

作为一个备注,等待/通知工作很好(生产者发布到共享集合和调用通知,消费者等待直到通知然后从共享集合读取),但现在并发实用程序(又名BlockingQueue)简化了等待/通知不再需要直接使用的事情。 – jtahlborn

回答

6

参见my comment

听起来像是你想要一个BlockingQueue - 这是生产者 - 消费者问题的一个非常普遍的要求。尽量不要重新发明轮子;-)

有存在多个BlockingQueue实现方式中,例如有界的ArrayBlockingQueue,无界的​​,传递SynchronousQueue,甚至PriorityBlockingQueue。全部BlockingDeque s和TransferQueue s也 s ;-)

+1

您不想使用SynchronousQueue,因为如果后台线程当前处于繁忙状态,则会阻塞主线程。 – jtahlborn

+0

@jtahlborn你是对的,但我没有建议使用它 - 我只是说它确实是一个'BlockingQueue'。我指定它是* hand-off * -style,并与规范相关联,以便阅读更多内容。 – oldrinb

+0

不用担心,我只是增加一些信息来帮助OP选择最佳BlockingQueue impl。 – jtahlborn

6

我建议你使用一个ExecutorService。我将一个队列与一个线程池结合在一起。

您可以向后台提交任务并在后台执行,您可以根据需要获得结果。

ExecutorService service = Executors.newWhateverPool(); 
service.submit(new Runnable() { your task here });