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类的对象,是两个不同的对象锁,所以有以上结果。