package A_ShangGuiGu.Thread.ThreadTest;标签:Thread,唤醒,线程,notify,new,方法,wait From: https://www.cnblogs.com/zhazhawei906/p/16820235.html
/**
* 线程通信的实例:两个线程交替打印1-100,一人一次
* 涉及到的方法:
* wait():调用wait()方法会使得调用该方法的线程进入阻塞状态。同时释放锁。
* notify():唤醒一个wait的线程,如果只有一个线程,则唤醒一个,如果有多个线程则唤醒优先级高的,如果优先级相同则随机唤醒。
* notifyAll():唤醒所有线程。
* 说明:
* 这三个方法必须使用到同步代码块或者同步方法中。
* 这三个方法的调用者必须是同步代码块或者同步方法的锁。也就是同步监视器synchronized (this)里的this
* 如果不一致会导致异常。
* 这三个方法是定义在java.lang.Object包下
*/
class Test01 implements Runnable{
private int a = 1;
@Override
public void run() {
while (true){
synchronized (this) {
this.notifyAll();
if (a<=100){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName()+"打印数据:"+a);
a++;
try {
this.wait();//调用wait()方法会使得调用该方法的线程进入阻塞状态。同时释放锁。
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else {
break;
}
}
}
}
}
public class CommunicationTest {//线程通信。
public static void main(String[] args) {
Test01 test01 = new Test01();
Thread t1 = new Thread(test01);
Thread t2 = new Thread(test01);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}