对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
另外,wait()需要结合synchronized进行使用,对于没有在同步代码块的锁的对象直接使用wait()方法,会直接抛出异常。
附上代码
package com.chenzj.thread;
public class ThreadJoin implements Runnable{
private String name;
private Object obj;
@Override
public void run() {
for (int i =0;i < 100;i++){
synchronized(obj){
System.out.println(name + i);
try {
Thread.sleep(20);
if (i == 2 && name.equals("a")){
obj.wait();
}
if (i == 90){
obj.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public ThreadJoin(String name,Object obj){
this.name = name;
this.obj = obj;
}
}
package com.chenzj.thread;
public class ThreadMain {
public static void main(String[] args) {
try {
//obj作为锁
Object obj = new Object();
Thread a = new Thread(new ThreadJoin("a",obj));
Thread b = new Thread(new ThreadJoin("b",obj));
Thread c = new Thread(new ThreadJoin("c",obj));
a.start();
b.start();
c.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}