gpt4 book ai didi

java - 纯 Java : How do i know if my thread is sleeping or not?

转载 作者:行者123 更新时间:2023-11-30 05:53:41 25 4
gpt4 key购买 nike

我有一个线程可以做几件事。其中之一就是只睡一段时间。正常 hibernate 后,它会调用 delayFinished() 方法,但如果 hibernate 被中断,则不应调用 delayFinished()。我还需要一个中止 sleep 的方法,其他线程可能会调用它。

所以这是实现了我的意图,但我认为它行不通:

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() 被调用,并且在它 hibernate 时,abortDelay() 被另一个线程调用(主要用例),abortDelay() 将卡在同步语句上,因为 delay() 的调用者拥有该监视器并且尚未放弃它。

另一方面,如果延迟是这样实现的:

   private void delay() {
synchronized(sleepingControl) {
sleeping=true;
}
try {
sleep(delay);

有可能delay()被调用,完成同步块(synchronized block)设置 hibernate 为真,但随后 abortDelay() 被调用,它会调用 interrupt()即使线程还没有开始 hibernate 。

任何人都可以对这些尝试提出任何改进建议吗?

最佳答案

您需要研究 Object.wait()/notify() 而不是使用 sleep()。使用 wait() 的关键事情之一是它在等待时释放对象上的锁,允许另一个线程获取锁并使用 notify() 唤醒它。

例如

public class MyThread extends Thread {
private boolean aborted = false;
private final Object sleepingControl=new Object();

//... other unrelated stuff...

private void delay() {
try {
synchronized(sleepingControl) {
sleepingControl.wait(delay);

if (!aborted)
delayFinished();
}
} catch (InterruptedException e) {
}
}
public void abortDelay() {
synchronized(sleepingControl) {
aborted = true;
sleepingControl.notify();
}
}
}

这还不是全部,因为 wait() 有一个奇怪的实现怪癖,它可以虚假地唤醒。所以你需要手动循环 wait() 调用,如果它返回检查时间是否已经过期。

实际上,我认为您可以使用 java.util.concurrent 类更简单地实现上述目标。看一下 Lock 类。

关于java - 纯 Java : How do i know if my thread is sleeping or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com