[英]Threaded BlockingQueue, clarification needed
当使用BlockingQueue
,我实现了以下逻辑以对其进行读取,直到另行告知 。 不幸的是,以下情况间歇地发生:
问题:
作为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.