A J*_*son 6 java multithreading
我有一个扩展Thread的类.这个线程在运行时花费大部分时间睡觉,它将执行检查,如果为true则执行简单操作,然后睡眠1/2秒并重复.
该类还有一个由其他线程调用的公共方法.如果调用它,我希望线程在睡眠时睡眠时间更长,如果不是则立即睡觉.我试图让这个.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) {
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
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
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 24
你不能让另一个线程睡觉.(您可以使用已弃用的suspend()
方法,但请不要这样做).这个电话:
this.sleep(200);
Run Code Online (Sandbox Code Playgroud)
实际上将使当前正在执行的线程休眠 - 而不是Thread
由"this"引用.sleep
是一个静态方法 - 好的IDE会在该行上发出警告.
你应该只有一个标语说"请睡觉"然后让睡眠者线程在做任何工作之前检查那个标志.
你不能让另一个线程睡觉是一件好事.假设它是在同步方法中 - 这意味着你在睡觉时持有一个锁,导致其他人试图获得相同的锁来阻止.不是一件好事.通过使用基于标志的系统,您可以以受控的方式进入睡眠状态- 在您知道它不会造成伤害的位置.