sleep wait join yield的区别

作者: 念䋛 | 来源:发表于2021-10-09 21:25 被阅读0次
    线程状态:

    创建状态:创建一个线程实例 Thread thread = new Thread();
    就绪状态:在调用start()方法后,线程获取了除CPU的其他资源,处于就绪状态
    执行状态:线程获取CPU使用权,run方法开始执行
    阻塞状态:运行中的线程由于其他原因放弃对CPU使用(其他线程抢占)而处于阻塞状态

    锁池:

    所有竞争的同步锁的线程都会放到锁池中,当前线程获取到锁,其余线程发现锁已经被当前线程获取,那获取不到锁的线程就会在锁池中等待,当前线程释放锁之后,在锁池中的线程就会竞争锁,某个线程获取到锁之后就会进入就绪状态,等待cpu分配时间片,由就绪状态变为执行状态

    等待池

    当调用了await方法的时候,线程就会在等待池中,等待池是不会去竞争锁资源的,只用其他线程调用了notifyAll后,处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果调用notify()方法,那么处于该对象的等待池中的随机一个线程会进入该对象的锁池.
    sleep和wait区别
    1.sleep是thread的静态方法,wait是Object类的本地方法
    2.sleep方法不会释放锁,wait是会释放锁,并加入到等待池中

    sleep是把cpu的使用权释放出去,当随眠时间结束之后会重新获取cpu资源,等待cpu分配时间片,如果sleep时该
    线程获取锁,那sleep睡眠的时候是不会释放锁的,就是其余的线程是不会获取锁的,如果睡眠期间其他线程调用
    了当前睡眠线程的interrupt方法,那么调用interrupt方法的线程会抛出异常.
    

    3.sleep不依赖synchronized,但是wait是需要依赖synchronized
    4.sleep不需要被唤醒,wait是需要被唤醒的
    5.sleep只是针对当前线程,而wait和notify配合使用可以实现多线程的通讯.
    6.sleep会让出cpu资源,并且会上下文的切换,wait不一定会,因为可能会有机会重新竞争获取到锁

    yield

    执行后线程直接进入到就绪状态,马上释放cpu使用权,但是依然持有cpu的执行资格,所以可能马上又获取到cpu的使用权,继续执行代码

    join

    执行join方法的线程会让当前线程进入阻塞状态
    t1 t2两个线程同时执行,当t2中的代码中调用了t1的join方法,t2会阻塞直到t1执行结束,t2继续执行代码

    相关文章

      网友评论

        本文标题:sleep wait join yield的区别

        本文链接:https://www.haomeiwen.com/subject/wqlcoltx.html