目录
1.涉及到的方法:
wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
notify():一旦执行此方法,就会唤醒wait的一个线程。如果多个线程被wait,则唤醒优先级最高的线程
notifyAll():一旦执行此方法,就会唤醒所有被wait的线程
2.注意事项:
(1)三个方法必须在同步代码块或同步方法中使用,
(2)三个方法的调用者必须是同步代码块或同步方法中的同步监视器
(3)三个方法是是定义在object中的
3.wait()和sleep()的异同
相同点:都可以是线程进入阻塞状态
不同点:
分别在Thread和object中申明;
调用的要求不同:sleep可以在任何场景下使用,wait则需要在同步代码块和同步方法中使用;
sleep不会释放同步监视器,而wait会。
package MultiThreads;
//交替打印1-100
public class demo9 {
public static void main(String[] args) {
Number n=new Number();
Thread t1=new Thread(n);
Thread t2=new Thread(n);
t1.start();
t2.start();
}
}
class Number implements Runnable{
int number=0;
@Override
public void run() {
while (true) {
synchronized (this) {
notify();//唤醒一个,若要唤醒所有的,则用notifyAll();
if (number <= 100) {
System.out.println(Thread.currentThread().getName() + " " + number);
number++;
try {
wait();//调用wait方法的线程会进入阻塞状态,并释放锁
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} else break;
}
}
}
}