首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

java 线程 sleep 与 wait 的差异

2012-08-27 
java 线程 sleep 与 wait 的区别java 线程 Thread 类的sleep 静态方法可以让当前线程睡眠(如果该线程持有

java 线程 sleep 与 wait 的区别
java 线程 Thread 类的sleep 静态方法可以让当前线程睡眠(如果该线程持有某一对象的锁,sleep 时不会释放该锁。如果该线程没有拥有对象锁,则sleep 也不会锁定某一对象)。

而wait 方法也能够阻塞线程,让其睡眠一段时间或等待其它线程唤醒,不过,在调用wait 方法进入睡眠的时候,如果该线程拥有某一个对象锁,则在该线程进入睡眠时会释放该线程拥有的对象锁。


参考示例:

/** * 测试sleep 方法与 wait 方法的区别 */class Task implements Runnable{private int time = 0;public void run(){fun1();}public synchronized void fun1(){System.out.println(Thread.currentThread().getName()+ " start running time "+ time);}public synchronized void fun2(){try{System.out.println(Thread.currentThread().getName()+ " start running time "+ time);//Thread.sleep(3000);wait(3000);time += 3;  System.out.println(Thread.currentThread().getName()+ " end running time "+ time);}catch(Exception e){e.printStackTrace();}}}public class ThreadTest{public static void main(String[] args){Task task = new Task();Thread thread = new Thread(task);thread.start();task.fun2();}}


运行结果:
main start running time 0
Thread-0 start running time 0
main end running time 3

改换成Thread.sleep
/** * 测试sleep 方法与 wait 方法的区别 */class Task implements Runnable{private int time = 0;public void run(){fun1();}public synchronized void fun1(){System.out.println(Thread.currentThread().getName()+ " start running time "+ time);}public synchronized void fun2(){try{System.out.println(Thread.currentThread().getName()+ " start running time "+ time);//Thread.sleep(3000);wait(3000);time += 3;  System.out.println(Thread.currentThread().getName()+ " end running time "+ time);}catch(Exception e){e.printStackTrace();}}}public class ThreadTest{public static void main(String[] args){Task task = new Task();Thread thread = new Thread(task);thread.start();task.fun2();}}

运行结果:

main start running time 0
main end running time 3
Thread-0 start running time 3

但是如果把fun1 换成 静态方法,
/** * 测试sleep 方法与 wait 方法的区别 */class Task implements Runnable{private static int time = 0;public void run(){fun1();}public static synchronized void fun1(){System.out.println(Thread.currentThread().getName()+ " start running time "+ time);}public synchronized void fun2(){try{System.out.println(Thread.currentThread().getName()+ " start running time "+ time);Thread.sleep(3000);//wait(3000);time += 3;  System.out.println(Thread.currentThread().getName()+ " end running time "+ time);}catch(Exception e){e.printStackTrace();}}}public class ThreadTest{public static void main(String[] args){Task task = new Task();Thread thread = new Thread(task);thread.start();task.fun2();}}



运行结果为:
main start running time 0
Thread-0 start running time 0
main end running time 3

这是因为当方法为静态时,线程锁定的是Task类对应的Class类的对象的锁,而Thread.sleep 锁定的是Task类的对象,是两个不同的对象锁,所以有以上结果。

热点排行