私はこのコードを持っています
public MultiThreadedSum(ArrayBuffer ArrayBufferInst)
{
this.ArrayBufferInst = ArrayBufferInst;
Sum = 0;
Flag = false;
StopFlag = false;
}
public synchronized void Sum2Elements()
{
while(Flag)
{
try {wait();}
catch (InterruptedException e){}
}
Flag = true;
if (StopFlag)
{
notifyAll();
return;
}
System.out.println("Removing and adding 2 elements.");
Sum = ArrayBufferInst.Sum2Elements();
notifyAll();
}
public synchronized void InsertElement()
{
while(!Flag)
{
try {wait();}
catch (InterruptedException e){}
}
Flag = false;
if (StopFlag)
{
notifyAll();
return;
}
System.out.println("Inserting the sum.");
ArrayBufferInst.InsertElement(Sum);
if (ArrayBufferInst.RetunrSize() == 1)
{
StopFlag = true;
}
System.out.println(ArrayBufferInst);
notifyAll();
}
ご覧のとおり、最初に Flag を false に設定して、スレッドの 1 つが Sum2Elements メソッドに入り、それを true に変更して、全員を待たせるようにします。
同期されたコードでは、1 つのスレッドだけがそのことを実行できることを知っています。ここでは 2 つの同期されたメソッドがあります。2 つのスレッドが各 notifyall の後にこのメソッドを実行しようとしているということですか?
もしそうなら、一方のスレッドが Sum2Elements に入り、もう一方のスレッドが InsertElement に入る前にフラグを true に変更し、それによって while ループをスキップすることはできませんか?
ありがとう