Java 让线程无限期等待
我有一个JavaJava 让线程无限期等待,java,multithreading,wait,Java,Multithreading,Wait,我有一个Java线程,它处理与套接字的传出通信。我只希望线程在有挂起的输出准备发送时运行。假设我有一个堆栈,它保存等待发送的数据,我希望comms线程在向堆栈添加内容时醒来,在堆栈为空时进入睡眠状态。最好的方法是什么 我看到的选择是 使用wait()/notify()-现在似乎是实现这种行为的老方法 让线程每x毫秒检查一次是否有任何内容要发送 每次构造一个新的线程(昂贵) 让线程持续运行(昂贵) 实现一些线程池或执行器解决方案 任何建议都很好:)如果java.util.concurrent库中的
线程
,它处理与套接字的传出通信。我只希望线程在有挂起的输出准备发送时运行。假设我有一个堆栈
,它保存等待发送的数据,我希望comms线程在向堆栈添加内容时醒来,在堆栈为空时进入睡眠状态。最好的方法是什么
我看到的选择是
使用wait()/notify()
-现在似乎是实现这种行为的老方法
让线程每x毫秒检查一次是否有任何内容要发送
每次构造一个新的线程
(昂贵)
让线程持续运行(昂贵)
实现一些线程池或执行器解决方案
任何建议都很好:)如果java.util.concurrent库中的数据结构满足您的需要,您可以使用该库。像这样的东西可能适合你。正是你想要的。您的通信线程阻塞在take()
上,当其他线程执行add
/put
时,它会立即被唤醒
这种方法有几个优点:您可以让多个线程(使用者)共享同一队列以提高吞吐量,也可以让多个线程(生产者)生成消息(消息传递)。+1,感谢您的响应,我将另一个标记为正确,因为它的信息稍多:)内部BlockingQueue使用等待和通知是真的吗?@Pacerier:的确:BlockingQueue
是一个接口,因此它无法使用任何同步,因为它没有代码。同样,例如ArrayBlockingQueue
实现的源代码是免费提供的。如果您查看它,您会发现ReentrantLock
和Condition
对象,而不是wait
和notify()
,至少在Sun的1.6实现中是如此。@TomaszNurkiewicz Ic,因此,ReentrantLock在内部使用睡眠/中断模式,而不是等待/通知。@Pacier:我不是java.util.concurrent
实现方面的专家,但看起来尽可能多地使用CAS(比较和设置)操作,请参阅java.util.concurrent.locks.AbstractQueuedSynchronizer