繁体   English   中英

线程化BlockingQueue,需要澄清

[英]Threaded BlockingQueue, clarification needed

当使用BlockingQueue ,我实现了以下逻辑以对其进行读取,直到另行告知 不幸的是,以下情况间歇地发生:

问题:

  • 即使在shouldContinueReading设置为false之后,循环也不会始终中断
  • 问题是断断续续的,有时一切正常

作为QThread类的一部分,我声明:

public static volatile boolean          shouldContinueReading   = true;

运行(确认正在执行)的方法包含:

    while (shouldContinueReading) {
        try {

            String retrieved = qIn.poll(2, TimeUnit.MILLISECONDS);
            if (retrieved != null)
                consume(retrieved);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    System.out.println("I am out");  // <-- not always seen
    if (qIn.remainingCapacity() > 0) {
        try {
            consume(qIn.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

进行此操作时,在另一个线程中,当某些事情发生时, shouldContinueReading更改状态

    while (stillReading) {
        // do nothing
    }

    QThread.shouldContinueReading = false;

更新:问题已解决

事实证明,问题还在于:

private void consume(String take) {
            // some processing

    produce(newData.toString());
}

private void produce(String newData) {
    System.out.println(newData);
    try {
        qOut.put(newData);          // <-- Problem is here. Should use offer instead of put
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

qIn(队列输入)和qOut(队列输出)都声明为:

private volatile BlockingQueue<String>  qIn;
private volatile BlockingQueue<String>  qOut;

对象本身是在其他地方创建的,如下所示,并传递给构造函数:

    BlockingQueue<String> q1 = new SynchronousQueue<String>();
    BlockingQueue<String> q2 = new SynchronousQueue<String>();

    QThread qThread = new QThread(q1, q2);

有什么建议么? 我应该如何使用qOut? 我没有正确声明吗?

我打赌QThread.shouldContinueReading = false; 不是总是被执行,或者读取线程不是一开始就执行。 也就是说,您看到的问题可能在上游某处-不在这里。 我要做的第一件事就是以100%的信心确定问题的确切出处(增加一些打印语句)。

除了问题之外,我建议使用线程中断机制,而不要滚动自己的标志(这只是荣耀的标志,但是那样一来,您就可以影响诸如BlockedQueue类的第三方代码,并使实现更简单,更多高效),即使这是生产代码也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM