sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.
区别一:
sleep是Thread类的方法,是线程用来 控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。
wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待直到其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。
区别二 :
关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁(自己的感觉是sleep方法本来就是和锁没有关系的,因为他是一个线程用于管理自己的方法,不涉及线程通信)
区别三:
使用区域
由于wait函数的特殊意义,所以他是应该放在同步语句块中的,这样才有意义 。因为wait 必须在 synchronized内部调用。
注意:两个方法都需要抛出异常
package com.test.sleepwait;
public class MultiThread {
public static void main(String[] args){
new Thread(new Thread1()).start();
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
}
class Thread1 implements Runnable{
@Override
public void run(){
synchronized(MultiThread.class){
System.out.println("Enter thread1...");
System.out.println("Thread1 is waiting...");
try{
MultiThread.class.wait();
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread1 is going on ....");
System.out.println("thread1 is over!!!");
}
}
}
class Thread2 implements Runnable{
@Override
public void run(){
synchronized(MultiThread.class){
System.out.println("Enter thread2...");
System.out.println("Threa2 is waiting...");
MultiThread.class.notifyAll();
try{
Thread.sleep(5000);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread2 is going on ....");
System.out.println("thread2 is over!!!");
}
}
}
打印
Enter thread1...
Thread1 is waiting...
Enter thread2...
Threa2 is waiting...
thread2 is going on ....
thread2 is over!!!
thread1 is going on ....
thread1 is over!!!
同时要注意一点:
当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
1. 其他方法前是否加了 synchronized 关键字,如果没加,则能。
2. 如果这个方法内部调用了 wait,则可以进入其他synchronized 方法。
3. 如果其他个方法都加了 synchronized 关键字,并且内部没有调用 wait,则不能。
(因为 sleep方法没有释放锁,而wait释放了锁。原来Thread2遇到 synchronized 语句时,由运行状态转为阻塞。 档Thread1中调用了wait,同时释放了锁,所以Thread2中的 synchronized块又重新获得锁,所以能进去了。
)