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