我正在为一个大学课程的多线程应用程序工作。 这个场景是一些精灵正在制作礼物并将它们存放在共享缓冲区上,而其他精灵则会将这些物品运送到儿童身上。 该程序是一个工作日的模拟,我设法使用每隔几秒钟点击一次的时钟线程。 当时钟结束时,每个线程都应该完成。 但在我的场景中发生的是,一个线程或一组线程不允许JVM在完成main的执行后终止。我试过在堆栈溢出和谷歌上发现类似的问题。我也尝试使用弃用的函数Thread.stop()来找出导致问题的线程。 我得出的结论是,有问题的线程就是这个。
public void run() {
while (!clock.isStopped()) {
double fairChance;
switch (turnTableID) {
case 1:
fairChance = Math.random();
if (fairChance >= 0.5) {
//conveyor belt A Takes one of the two belts
BeltSemaphores(entryBuffer);
} else {
BeltSemaphores(otherEntryBuffer);
}
break;
case 2:
//conveyor belt B
fairChance = Math.random();
if (fairChance >= 0.5) {
//conveyor belt B Takes one of the two belts
BeltSemaphores(entryBuffer);
} else {
BeltSemaphores(otherEntryBuffer);
}
break;
case 3:
BeltSemaphores(entryBuffer);
break;
case 4:
BeltSemaphores(entryBuffer);
break;
}
}
}
public void BeltSemaphores(ConveyorBelt belt) {
try {
//BELT SEMAPHORES
belt.full.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
belt.mutex.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
///SACK SEMAPHORES
if (sackOne != null && sackOne.SackID == belt.peek().getAgeGroup()) {
SackSemaphores(sackOne, belt);
} else if (sackTwo != null && sackTwo.SackID == belt.peek().getAgeGroup()) {
SackSemaphores(sackTwo, belt);
} else {
try {
exitBuffer.empty.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
exitBuffer.mutex.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
Present a = belt.pop();
exitBuffer.push(a);
exitBuffer.mutex.release();
exitBuffer.full.release();
}
//------------------
belt.mutex.release();
belt.empty.release();
}
public void SackSemaphores(Sack sack, ConveyorBelt belt) {
try {
sack.empty.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
sack.mutex.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
sack.addToSack(consume(belt));
sack.mutex.release();
sack.full.release();
}
}
你知道是什么原因引起了我的问题吗?所有其他线程共享while(!clock.isStopped())
函数并正常终止。