zoukankan      html  css  js  c++  java
  • sleep()和wait()的区别

    sleep()方法是属于Thread类的,wait()方法属于Object类。sleep()方法导致线程睡眠一段时间,让出cpu给其他线程,但是该线程依然处于被监控状态,并没有释放对象的锁,所以线程睡眠期间,其他线程不能获得该对象的锁,不能对该对象的其他同步方法进行调用。

    wait()方法被调用会导致线程阻塞,该线程会释放对象的锁,并进入等待此对象的等待锁定池,处于挂起状态。除非此对象调用了notify()或者notifyALL()方法,本线程才会进入对象锁定池准备。

    package cn.yqg.day2;
    
    public class Thread1 implements Runnable{
    
        @Override
        public void run() {
            
           synchronized(Test.class) {
           System.out.println("进入线程1");
           try {
            Thread.sleep(100);
        } catch (InterruptedException e) {    
            e.printStackTrace();
        }
           System.out.println("线程1结束");
           }
        }
    }
    package cn.yqg.day2;
    
    public class Thread2 implements Runnable{
        public void run() {
            synchronized(Test.class) {
                System.out.println("进入线程2");
                try {
                    Test.class.wait();
                } catch (InterruptedException e) {
                    
                    e.printStackTrace();
                }
                System.out.println("结束线程2");
            }
        }
    }
    package cn.yqg.day2;
    
    public class Test {
      public static void main(String[] args) {
        new Thread(new Thread2()).start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            
            e.printStackTrace();
        }
        new Thread(new Thread1()).start();
    }
    }

    运行上面结果为:

    进入线程2
    进入线程1
    线程1结束

    我们修改Thread1类

    package cn.yqg.day2;
    
    public class Thread1 implements Runnable{
    
        @Override
        public void run() {
            
           synchronized(Test.class) {
           System.out.println("进入线程1");
           try {
            Thread.sleep(100);
            Test.class.notify();//Thread2结束挂起状态,进入就绪状态,等待运行
        } catch (InterruptedException e) {    
            e.printStackTrace();
        }
           System.out.println("线程1结束");
           }
        }
    }

    以上结果为:

    进入线程2
    进入线程1
    线程1结束
    结束线程2

    ------------------------------------------------------------------------------------------------------------------------------

    总的来说,sleep不会释放对象的锁,wait()会释放对象的锁。

  • 相关阅读:
    (转)软件架构设计
    (转)IDG副总裁楼军:顶级VC青睐什么样的创业者
    (转)使用Aspose.Cell控件实现Excel高难度报表的生成(一)
    (转)创业者应该有的5个正常心态
    (转)成功创业者的7个好习惯
    (转)SqlServer2008 数据库同步的两种方式 (发布、订阅)
    (转)Salesforce的440亿美金并购宣告企业软件市场进入3.0互联网化时代
    (转)创始人之间如何分股权:按贡献估值
    (转)各种大型网站技术架构
    使用FileSystem类进行文件读写及查看文件信息
  • 原文地址:https://www.cnblogs.com/zzuli/p/9381141.html
Copyright © 2011-2022 走看看