黑马程序员-wait和sleep的作用和区别

来源:互联网 发布:ecshop淘宝客采集插件 编辑:程序博客网 时间:2024/05/18 13:10

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

package com.itcast.test2;/** * wait方法和sleep方法有什么作用,区别是什么? * sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程, * 但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 *  wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁, *  进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后 *  本线程才进入对象锁定池准备获得对象锁进入运行状态。)  * @author shandawang * */public class MultiThread {     public static void main(String[] args) {          // TODO Auto-generated method stub          new Thread(new Thread1()).start();          try {              Thread.sleep(500);          } catch (InterruptedException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }          new Thread(new Thread2()).start();              }     private static class Thread1 implements Runnable     {          @Override          public void run() {              // TODO Auto-generated method stub          //由于这里的Thread1和下面的Thread2内部run方法要用同一对象作为监视器,我们这里不能用this,          //因为在Thread2里面的this和这个Thread1的this不是同一个对象。我们用MultiThread.class这个          //字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。              synchronized (MultiThread.class) {                   System.out.println("enter thread1...");                   System.out.println("thread1 is waiting");                   try {                   //释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的                   //代码范围,另一种方式就是在synchronized关键字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。                        MultiThread.class.wait();                   } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                   }                   System.out.println("thread1 is going on...");                   System.out.println("thread1 is being over!");                           }          }     }     private static class Thread2 implements Runnable     {          @Override          public void run() {              // TODO Auto-generated method stub              synchronized (MultiThread.class) {                   System.out.println("enter thread2...");                   System.out.println("thread2 notify other thread can release wait status..");                   //由于notify方法并不释放锁, 即使thread2调用下面的sleep方法休息了500毫秒,但thread1仍然                   //不会执行,因为thread2没有释放锁,所以Thread1无法得不到锁。                   MultiThread.class.notify();                  // System.out.println("thread2 is sleeping ten millisecond...");                   System.out.println("thread2 is waiting, other thread can run now...");                   try {                        //Thread.sleep(10);                        MultiThread.class.wait();                   } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                   }                   System.out.println("thread2 is going on...");                   System.out.println("thread2 is being over!");              }          }     }    }

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------


原创粉丝点击