不同点
1.wait方法是Object类对象的方法,sleep是Thread类的静态方法。
2.wait方法必须与synchronized配合使用,sleep可以不与synchronized配合使用。
3.sleep在睡眠的同时不会释放对象锁,wait在等待的时候会释放对象锁。
相同点
wait(long time)方法和sleep(long time)方法,都带有时间的方法,调用后线程都会进入time_wating状态。
如何正确使用wait,notify方法
synchronized(lock) {
while(条件不成立) {
lock.await();
}
// 干活
}
// 另一个线程
synchronized(lock) {
lock.notifyAll();
}
public class WaitDemo {
static final Object lock = new Object();
static boolean hasCigarette =false;
static boolean hasMeal =false;
public static void main(String[] args) {
new Thread(() -> {
synchronized (lock) {
System.out.println("有烟没?"+ hasCigarette);
while (!hasCigarette) {
try {
System.out.println("没烟,先歇会");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(hasCigarette) {
System.out.println("继续干活...");
} else {
System.out.println("没有干成活");
}
}
}, "小明").start();
new Thread(() -> {
synchronized (lock) {
System.out.println("有饭没?"+ hasMeal);
while (!hasMeal) {
try {
System.out.println("没饭,先歇会");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(hasMeal) {
System.out.println("继续工作...");
}else {
System.out.println("没有工作");
}
}
}, "小红").start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
synchronized (lock) {
hasCigarette = true;
System.out.println("烟到了");
lock.notifyAll(); //唤醒了上面两个处于waiting状态的线程,只有等烟的线程执行了,等饭的线程又进入下一次的waiting状态
}
}).start();
}
}