Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-带条件问题的blockingQueue_Java_Multithreading_Producer Consumer_Blockingqueue - Fatal编程技术网

java-带条件问题的blockingQueue

java-带条件问题的blockingQueue,java,multithreading,producer-consumer,blockingqueue,Java,Multithreading,Producer Consumer,Blockingqueue,我有两个线程,第一个线程执行一些任务(称为TaskManager) 第二个侦听事件并将其存储在队列中(称为EventManager)。 仅当队列不为空且某些条件为真时,才应唤醒EventManager并开始运行。(当EventManager当前未执行时)!EventManager.isRunning()) 例代码: class TaskManager implements Runnable { @Override public void run() {

我有两个线程,第一个线程执行一些任务(称为TaskManager) 第二个侦听事件并将其存储在队列中(称为EventManager)。 仅当队列不为空且某些条件为真时,才应唤醒EventManager并开始运行。(当EventManager当前未执行时)!EventManager.isRunning()

例代码:

class TaskManager implements Runnable {

    @Override 
    public void run() {     
        try {
            while (true) {
                Object event = blockingQueue.take();
                while(event != null && eventManager.isRunning()) {

                }
                            // handle event
            }
        } catch (InterruptedException ie) {
            // handle exception
        } catch (Exception e) {
            // handle exception
        }
    }
}
这样,只要队列中没有任何内容,线程就会一直等待,但如果eventManager仍在运行,线程就会无限循环,这将导致饥饿

有没有像blockingQueue这样的现有框架会在队列中插入内容时等待并被唤醒 另一个条件将满足(保持公平)

我可以自己使用notify()和wait()解决这个问题,但我更喜欢使用现有的解决方案


如果您有任何建议,我们将不胜感激?

请澄清,当队列中有事件且某些条件为真时,您的线程应该被唤醒?可能是某种类型的信号灯?也可能是您在问题中混淆了任务管理器和事件管理器的部分?你的意思不太清楚。是的,当队列中有事件并且某些条件为真时,我的线程应该被唤醒。我已经编辑了这个问题,希望现在更清楚了。。