我写了一个典型的生产者-消费者程序:一个生产者,负责填充队列;一个消费者,负责使队列出队。下面是我的实现。
棘手的部分是还有另一个共享变量vFlag。process(str)可能会将其值更改为true ,这将被生产者线程检测到,并导致清空队列。
private class PQueue
{
private Queue<String> queue;
PQueue()
{
queue = new LinkedList<String>();
}
public synchronized void add(String str)
{
if(queue.size() > 1)
{
wait();
}
queue.add(token);
notify();
}
public synchronized String poll()
{
if(queue.size() == 0)
{
wait();
}
String str = queue.poll();
notify();
return str;
}
public synchronized void clear()
{
queue.clear();
}
}
PQueue queue = new PQueue();
private class Producer implements Runnable
{
public void run()
{
while (true) {
String str = read();
queue.add(str);
if(vFlag.value == false)
{
queue.clear();
vFlag.value = true;
}
if (str.equals("end"))
break;
}
exitFlag = true;
}
}
private class Consumer implements Runnable
{
public void run()
{
while(exitFlag == false)
{
String str = queue.poll();
process(str, vFlag);
}
}
}
现在,仍然存在一些错误。谁能给我一些一般的线索或建议,比如更好的并发编程理念或机制来避免并发错误?
对于上述实现,程序有时会在process(str, vFlag)中报告错误:
Exception in thread "Thread-3" java.lang.NullPointerException
在其他情况下,程序正常运行。如果我注释掉queue.clear(),效果很好。