Java 让线程无限期等待

Java 让线程无限期等待,java,multithreading,wait,Java,Multithreading,Wait,我有一个Java线程,它处理与套接字的传出通信。我只希望线程在有挂起的输出准备发送时运行。假设我有一个堆栈,它保存等待发送的数据,我希望comms线程在向堆栈添加内容时醒来,在堆栈为空时进入睡眠状态。最好的方法是什么 我看到的选择是 使用wait()/notify()-现在似乎是实现这种行为的老方法 让线程每x毫秒检查一次是否有任何内容要发送 每次构造一个新的线程(昂贵) 让线程持续运行(昂贵) 实现一些线程池或执行器解决方案 任何建议都很好:)如果java.util.concurrent库中的

我有一个Java
线程
,它处理与
套接字的传出通信。我只希望线程在有挂起的输出准备发送时运行。假设我有一个
堆栈
,它保存等待发送的数据,我希望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