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结束
大家通过本来应该完全明白了其区别。。。。。。。

你可能感兴趣的:(thread)