我有一个线程可以做几件事。其中之一就是只睡一段时间。正常睡眠后它会调用delayFinished()
方法,但如果睡眠被中断,则delayFinished()
不应调用。我还需要一个中止睡眠的方法,它可能被其他线程调用。
所以这是捕捉我意图的实现,但我认为它不会起作用:
public class MyThread extends Thread {
private boolean sleeping=false;
private Object sleepingControl=new Object();
//... other unrelated stuff...
private void delay() {
try {
synchronized(sleepingControl) {
sleeping=true;
sleep(delay);
sleeping=false;
delayFinished();
}
} catch (InterruptedException e) {
sleeping=false;
}
}
public void abortDelay() {
synchronized(sleepingControl) {
if (sleeping)
interrupt();
}
}
}
Ifdelay()
被调用,并且当它处于睡眠状态时,abortDelay()
被另一个线程(主要用例)调用,abortDelay()
将挂在同步语句上,因为调用者delay()
拥有该监视器并且尚未放弃它。
另一方面,如果延迟以这种方式实现:
private void delay() {
synchronized(sleepingControl) {
sleeping=true;
}
try {
sleep(delay);
有可能delay()
被调用,完成同步块设置 sleep 为 true,但随后abortDelay()
被调用,interrupt()
即使线程尚未开始睡眠,它也会调用。
任何人都可以建议对这些尝试进行任何改进吗?