sleep()、wait()、join()、yield()的区别
-
sleep()是Thread类的静态本地方法,wait()则是Object类的本地方法
-
sleep()不会释放lock,但wait()会释放,而且会加入到等待队列中
sleep()就是把cpu的执行资格和执行权释放出去,不再运行此线程,当定时时间结束再取回cpu资源,参与cpu的调度,获取到cpu资源后就可以继续运行了。而如果sleep()时该线程有锁,那么sleep不会释放这个锁,而是把锁带者进入冻结状态,也就是说其他需要这个锁的线程根本不可能获取到这个锁,也就是说无法执行程序。如果在睡眠期间其他线程调用了这个线程的interrupt(),那么这个线程也会抛出InterruptException异常,这点和wait()是一样的。
-
sleep()不依赖于同步器synchronized,但wait()需要依赖synchronized
-
sleep()不需要被唤醒(休眠之后推出阻塞),但是wait()需要(不指定时间需要被唤醒)
-
sleep()一般用于当前线程休眠,或者轮询暂停操作,wait()则多用于多线程之间的通信
-
sleep()会让出cpu执行时间且强制上下文切换,而wait()则不一定,wait()后可能还有机会重新竞争到锁继续执行
-
yield()执行后线程直接进入就绪状态,马上释放了cpu的执行权,但依然保留了cpu的执行资格,所以有可能cpu下次进行线程调度还会让这个线程获取到执行权继续执行
-
join()执行后线程进入阻塞状态,例如在线程B中调用线程A的join(),那线程B会进入阻塞队列,直到线程A结束或中断线程
// 打印: 1 2
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1");
});
thread.start();
thread.join();
// 因为join()的缘故,必须要等thread全部执行完,才能执行下面的打印
System.out.println("2");
}