我正在使用信号量来强制在我的程序中执行一些命令:我有一个主线程和一些在主线程中创建的子线程。 在每个步骤的主线程中打勾了一个时钟,之后我希望每个子线程一个接一个地运行。子线程的顺序并不重要,但我希望它们都在每一步中运行(并且每一步中只运行一次)。 我已经写过这段代码,但问题是,在某些情况下,在一些子线程上运行几次而不让别人有机会运行?!如何在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
如果您有要按特定顺序执行的任务,则应该在同一个线程中执行全部任务。如果您有多个可以按任意顺序执行的独立任务,则多个线程很有用。 –