1. sleep() 方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁”。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
Thread.sleep(1000);
2. wait() 方法
wait() 方法是 Object 类的一个 final 方法,其定义如下:
public final void wait() throws InterruptedException {
wait(0);
}
调用 wait() 方法后,在其他线程调用对象的 notify() 或 notifyAll() 方法前,当前线程处于等待状态。当前线程会释放掉它所占有的“锁”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出 IllegalMonitorStateException 异常。
唤醒当前对象锁的等待线程使用 notify() 或 notifyAll() 方法,也必须拥有相同的对象锁,否则也会抛出 IllegalMonitorStateException 异常。
waite() 和 notify() 必须在 synchronized 函数或 synchronized 块中进行调用。如果在 non-synchronized 函数或 non-synchronized 块中进行调用,虽然能编译通过,但在运行时会发生 IllegalMonitorStateException 的异常。
3. yield() 方法
暂停当前正在执行的线程。
yield() 只是使当前线程重新回到可执行状态,所以执行 yield() 的线程有可能在进入到可执行状态后马上又被执行。
yield() 只能使同优先级或更高优先级的线程有执行的机会。
4. join() 方法
等待调用 join() 方法的线程终止后,继续执行后续任务。
其他线程会等待调用join方法的线程结束,再继续执行。
如:t.join(); // 主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
测试示例如下:
public class Test {
/**
* @Title: main
* @Description: join 测试
* @param args
* @version 1.0
*/
public static void main(String[] args) {
Thread t1 = new MyThread1();
t1.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " 线程第" + i + "次执行!");
if (i > 0) {
try {
// t1线程调用 join() 后,主线程停止执行,直到t1执行完毕后继续执行
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class MyThread1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " 线程第" + i + "次执行!");
}
}
}
执行结果:
main 线程第0次执行!
Thread-0 线程第0次执行!
main 线程第1次执行!
Thread-0 线程第1次执行!
Thread-0 线程第2次执行!
Thread-0 线程第3次执行!
Thread-0 线程第4次执行!
Thread-0 线程第5次执行!
Thread-0 线程第6次执行!
Thread-0 线程第7次执行!
Thread-0 线程第8次执行!
Thread-0 线程第9次执行!
main 线程第2次执行!
main 线程第3次执行!
main 线程第4次执行!
main 线程第5次执行!
main 线程第6次执行!
main 线程第7次执行!
main 线程第8次执行!
main 线程第9次执行!
从结果可以看出:t1线程调用 join() 后,主线程停止执行,直到t1执行完毕后继续执行