0
点赞
收藏
分享

微信扫一扫

sleep()、wait()、join()、yield()的区别

elvinyang 2022-02-12 阅读 85

sleep()、wait()、join()、yield()的区别

  1. sleep()是Thread类的静态本地方法,wait()则是Object类的本地方法

  2. sleep()不会释放lock,但wait()会释放,而且会加入到等待队列中

    sleep()就是把cpu的执行资格和执行权释放出去,不再运行此线程,当定时时间结束再取回cpu资源,参与cpu的调度,获取到cpu资源后就可以继续运行了。而如果sleep()时该线程有锁,那么sleep不会释放这个锁,而是把锁带者进入冻结状态,也就是说其他需要这个锁的线程根本不可能获取到这个锁,也就是说无法执行程序。如果在睡眠期间其他线程调用了这个线程的interrupt(),那么这个线程也会抛出InterruptException异常,这点和wait()是一样的。

  3. sleep()不依赖于同步器synchronized,但wait()需要依赖synchronized

  4. sleep()不需要被唤醒(休眠之后推出阻塞),但是wait()需要(不指定时间需要被唤醒)

  5. sleep()一般用于当前线程休眠,或者轮询暂停操作,wait()则多用于多线程之间的通信

  6. sleep()会让出cpu执行时间且强制上下文切换,而wait()则不一定,wait()后可能还有机会重新竞争到锁继续执行

  7. yield()执行后线程直接进入就绪状态,马上释放了cpu的执行权,但依然保留了cpu的执行资格,所以有可能cpu下次进行线程调度还会让这个线程获取到执行权继续执行

  8. 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");
}
举报

相关推荐

0 条评论