zoukankan      html  css  js  c++  java
  • java基础知识回顾之java Thread类学习(九)--wait和notify区别

    wait和sleep区别:

    •  相同点:调用wait,sleep方法都可以是线程进入阻塞状态,让出cpu的执行权。
    •  不同点:1.sleep必须指定时间,但是wait方法可以指定时间,也可以不指定时间。

                       2.wait方法必须在同步中使用,但是sleep不一定在同步中使用。

                       3.在同步中,调用sleep方法释放CPU执行权,但是不会释放锁,即使让出了CPU执行权,其它线程也无法进入同步锁,不能得到执行。但是wait        方法不仅释放CPU执行权,而且释放同步锁,进入阻塞状态。也就是说其它等待此锁的线程可以得到同步锁并运行,阻塞的线程要想再次获得         CPU资格执行必须让其他线程调用notify方法唤醒。

    package com.lp.ecjtu.Thread;
    
    public class WaitOrSleep {
        private static  class Thread1 implements Runnable{
    
            @Override
            public void run() {
    //由于这里的Thread1和下面的Thread2内部的run方法要用同一个对象作为锁(监视器)
                //这里不能用this,因为Thread2里面的this和Thread1里面的this不是同一个对象
                //用WaitOrSleep.class这个字节码对象,因为引用的是同一个对象
    synchronized(WaitOrSleep.class){ System.out.println("进入线程1----------"); System.out.println("线程1----------wait"); try { WaitOrSleep.class.wait();//释放锁 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程1正在运行。。。。。。。。。"); System.out.println("线程1结束"); } } } private static class Thread2 implements Runnable{ @Override public void run() { synchronized(WaitOrSleep.class){ System.out.println("进入线程2----------"); System.out.println("线程2唤醒其它线程。。。。。。"); WaitOrSleep.class.notify();//线程2唤醒其其它线程 //由于notify并不释放锁,让线程2睡10毫秒,因为Sleep方法也不会释放锁,所以线程1不会执行 //等到线程2执行完了,才释放锁,线程1才执行 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2正在运行。。。。。。。。。"); System.out.println("线程2结束"); } } } /** * @param args */ public static void main(String[] args) { new Thread(new Thread1()).start(); new Thread(new Thread2()).start(); } }

    输出结果:

    进入线程1----------
    线程1----------wait
    进入线程2----------
    线程2唤醒其它线程。。。。。。
    线程2正在运行。。。。。。。。。
    线程2结束
    线程1正在运行。。。。。。。。。
    线程1结束
    大家通过本来应该完全明白了其区别。。。。。。。

     
  • 相关阅读:
    vue this,$set方法
    表格的拖拽排序功能---应用splice方法
    ES6方法的特性总结
    template functional
    scrollTop, offsetTop, pageYOffset, scrollY 的区别
    Sass @mixin 与 @include
    关于Vue中props的详解
    前端开发工具宝典
    前端js开发常用的60种工具方法
    element ui table表格里面插槽的使用方法
  • 原文地址:https://www.cnblogs.com/200911/p/3928967.html
Copyright © 2011-2022 走看看