【发布时间】:2012-05-03 20:46:15
【问题描述】:
我有一个线程可以做几件事。其中之一就是只睡一段时间。
正常睡眠后它会调用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();
}
}
}
如果delay() 被调用,并且在它处于睡眠状态时,abortDelay() 被另一个线程调用(主要用例),abortDelay() 将挂在同步语句上,因为delay() 的调用者拥有该监视器并且还没放弃呢。
另一方面,如果延迟是这样实现的:
private void delay() {
synchronized(sleepingControl) {
sleeping=true;
}
try {
sleep(delay);
可能是delay()被调用,完成同步块设置
睡眠为真,但随后调用abortDelay(),它会调用interrupt()
即使线程尚未开始睡眠。
任何人都可以对这些尝试提出任何改进建议吗?
【问题讨论】:
标签: java multithreading synchronized