1.sleep()是线程线程类(Thread)的静态方法。 wait()方法是Object类里的方法。
2. sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行 的机会;
当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间 到后还需要返还对象锁);其他线程可以访问;
即:
sleep()睡眠时,保持对象锁,仍然占有该锁;
wait()睡眠时,释放对象锁。
3.从字面意思就可以看出 sleep 是睡的意思,目的是为了停一会。 Wait 是等的意思,就是等某个线程来了,或许程序需要等另一个线程来一起完成某个任务, 比如发射原子弹的钥匙有两把,其中一个人把要是插入必须等另一个人把另一个吧钥匙也插入一起启动才能发射。如下程序全局变量变为2才可以执行输出 System.out.println("可以发射了");
public class MultiThread {
private static int type = 0;
private static class Thread1 implements Runnable{
@Override
public void run() {
//由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
//所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
synchronized(MultiThread.class){
type++;
System.out.println("enter thread1 ...");
System.out.println("thread1 is waiting");
System.out.println(type);
if(type>1){
System.out.println("可以发射了");
}
try{
//释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
//(2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
MultiThread.class.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("thread1 is going on ...");
System.out.println("thread1 is being over!");
}
}
}
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread1()).start();
}
}
4.sleep()方法可以在任何地方使用。wait()方法则只能在同步方法或同步块中使用,解锁必须在同一个对象锁的代码块中(只要同一个对象锁的代码块都叫一个),否则会在program runtime时扔 出”java.lang.IllegalMonitorStateException“异常。wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。 如下代码 在11处 22处是用同一个对象锁的代码块,所以在aa处wait()后 ,在 bb 处可以解锁
public class MultiThread {
private static class Thread1 implements Runnable {
@Override
public void run() {
//由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象
//所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象
synchronized (MultiThread.class) { //11
System.out.println("enter thread1 ...");
System.out.println("thread1 is waiting");
try {
//释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围
//(2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法
MultiThread.class.wait(); //aa
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread1 is going on ...");
System.out.println("thread1 is being over!");
}
}
}
private static class Thread2 implements Runnable {
@Override
public void run() {
//notify方法并不释放锁,即使thread2调用了下面的sleep方法休息10ms,但thread1仍然不会执行
//因为thread2没有释放锁,所以Thread1得不到锁而无法执行
synchronized (MultiThread.class) { //22
System.out.println("enter thread2 ...");
System.out.println("thread2 notify other thread can release wait status ...");
MultiThread.class.notify(); //bb
System.out.println("thread2 is sleeping ten millisecond ...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2 is going on ...");
System.out.println("thread2 is being over!");
}
}
}
public static void main(String[] args) {
new Thread(new Thread1()).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}
}