我正在使用信號量來強制在我的程序中執行一些命令:我有一個主線程和一些在主線程中創建的子線程。 在每個步驟的主線程中打勾了一個時鐘,之後我希望每個子線程一個接一個地運行。子線程的順序並不重要,但我希望它們都在每一步中運行(並且每一步中只運行一次)。 我已經寫過這段代碼,但問題是,在某些情況下,在一些子線程上運行幾次而不讓別人有機會運行?!如何在java中的信號量中強制排序
主線:
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
...
提示:當您釋放okToTick時,時鐘可能會打勾。而且,由於您在打印後立即發佈,時鐘有時會立刻出現並不奇怪。您需要等待所有子線程完成後再說可以打勾。祝你的作業好運。 – Hjalmar
如果您有要按特定順序執行的任務,則應該在同一個線程中執行全部任務。如果您有多個可以按任意順序執行的獨立任務,則多個線程很有用。 –