私は典型的な生産者/消費者プログラムを書きました。1人のプロデューサーがキューを埋める責任があります。キューのデキューを担当する1人のコンシューマー。以下は私の実装です。
トリッキーな部分は、別の共有変数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);
}
}
}
現在、まだいくつかのバグがあります。並行性のバグを回避するためのより優れた並行プログラミングの哲学やメカニズムなど、一般的な手がかりや提案を誰かに教えてもらえますか?
上記の実装では、プログラムがプロセスのエラーを報告することがあります(str、vFlag):
Exception in thread "Thread-3" java.lang.NullPointerException
それ以外の場合、プログラムは正常に実行されます。queue.clear()をコメントアウトすると、うまく機能します。