プログラムで何らかの順序を強制するためにセマフォを使用しています。メインスレッドと、メインスレッドで作成されたいくつかのサブスレッドがあります。すべてのステップのメインスレッドでクロックが刻み込まれ、その後、各サブスレッドを1つずつ実行します。サブスレッドの順序は重要ではありませんが、すべてのサブスレッドを各ステップで実行する必要があります (各ステップで 1 回だけ実行します)。私はこのコードを書きましたが、問題は、場合によっては、サブスレッドの 1 つのステップで複数回実行され、他のスレッドに実行の機会が与えられないことです?!
メインスレッド:
Semaphore okToTick = new Semaphore(3);
Semaphore okToWork = new Semaphore(0, true);
int i = 0;
new TestClass2(0, okToTick, okToWork);
new TestClass2(1, okToTick, okToWork);
new TestClass2(2, okToTick, okToWork);
while(true){
okToTick.acquire(3);
System.out.printf("\clock : %s\n", i++);
okToWork.release(3);
}
サブスレッド用の run():
semaphores here, passed by cnstr()
ID = //passed in by cnstr()
isBusy = false;
----------------------------------
try{
while(true){
okToWork.acquire();
if(!isBusy){
System.out.println("inside sub " + ID);
isBusy = true;
}
okToTick.release();
}
}
catch(Exception e){}
この結果が欲しい:
clock : 0
inside sub 1
inside sub 0
inside sub 2
clock : 1
clock : 2
...
しかし、時々私はこれを得る:
clock : 0
inside sub 1
clock : 1
inside sub 0
inside sub 2
clock : 2
...