Thread.sleep
是一种静态方法,它使当前正在执行的线程休眠指定的时间。Java 语法允许您通过变量调用静态方法,但编译器只是使用该变量的编译时类型来确定调用哪个方法,即
Thread ait = null;
ait.sleep(1000); // calls Thread.sleep(1000), causing current thread to sleep.
// In particular, does *not* NPE
您还提到wait()
- 虽然这是一个实例方法而不是静态方法,但它仍然会导致当前线程进行等待(ait.wait(1000)
将导致当前线程等待长达 1 秒或直到另一个线程调用ait.notifyAll()
)。
在Java 的早期引入了一个Thread.suspend()
和它的对应物,以允许一个线程控制另一个线程,但它们很快就被弃用了,因为它们天生容易死锁。resume()
如果您希望一个线程“控制”另一个线程,推荐的模式是合作进行,即拥有线程 A 设置和线程 B 读取的某种共享标志,并让 B根据标志让自己进入睡眠状态:
volatile boolean threadBShouldRun = true;
// Thread B
while(true) {
if(threadBShouldRun) {
// do some stuff
} else {
Thread.sleep(1000);
}
}
// Thread A
if(someCondition) {
threadBShouldRun = false;
}
但是使用包中存在的工具通常更容易且不易出错java.util.concurrent
。正确地做多线程比表面上看起来要困难得多。