我有一个扩展 Thread 的类。这个线程在运行时大部分时间都在睡眠,它会执行一个检查,如果 true 执行一个简单的操作,然后睡眠 1/2 秒并重复。
该类还有一个由其他线程调用的公共方法。如果调用此函数,我希望线程在已经休眠的情况下休眠更长时间,如果没有,则立即休眠。我尝试使用 this.sleep 但似乎这仍然使当前线程休眠,并且它抱怨方法 sleep 是静态的,应该静态访问。
这个程序显示了我的问题,当调用 CauseSleep 时,我希望它停止打印数字,直到睡眠完成。
public class Sleeper {
public static void main(String[] args) {
new Sleeper();
}
public Sleeper() {
System.out.println("Creating T");
T t = new T();
System.out.println("Causing sleep");
t.CauseSleep();
System.out.println("Sleep caused");
}
public class T extends Thread {
public T() {
this.start();
}
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println("T Thread: " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
public void CauseSleep() {
try {
this.sleep(2000);
} catch (InterruptedException e) {
}
}
}
}
我得到的输出是
Creating T
Causing sleep
T Thread: 0
T Thread: 1
T Thread: 2
T Thread: 3
T Thread: 4
T Thread: 5
T Thread: 6
T Thread: 7
T Thread: 8
T Thread: 9
T Thread: 10
T Thread: 11
T Thread: 12
T Thread: 13
T Thread: 14
T Thread: 15
T Thread: 16
T Thread: 17
T Thread: 18
Sleep caused
T Thread: 19
T Thread: 20
T Thread: 21
T Thread: 22
T Thread: 23
T Thread: 24
T Thread: 25
T Thread: 26
T Thread: 27
T Thread: 28
T Thread: 29
你不能让另一个线程休眠。 (您可以使用已弃用的suspend()
方法,但请不要)。这个电话:
this.sleep(200);
实际上将使当前正在执行线程睡眠 - 不是Thread
用“这个”来称呼。sleep
是一个静态方法 - 好的 IDE 会在该行发出警告。
你应该有一个标志说“请睡觉”,然后让睡眠线程在做任何工作之前检查该标志。
It's a good你不能导致另一个线程休眠。假设它是在同步方法中 - 这意味着您在睡眠时持有锁,导致其他试图获取相同锁的人被阻塞。不是什么好事。通过使用基于标志的系统,你可以睡在一个受控方式——在你知道它不会造成任何伤害的时候。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)