/*线程之间的通信方式:方式一:使用notify+wait+object实现线程之间的通信*/
/*实例:奇数线程打印10以内的奇数,偶数线程打印10以内的偶数*/
public class ThreadCommunication {
private int i = 0;
/*相当于synchronized 的钥匙*/
private Object object = new Object();
/*奇数*/
public void odd() {
synchronized (object){
while (i < 10) {
if (i % 2 == 1) {
System.out.println("奇数:" + i);
i++;
/*唤醒该线程*/
object.notify();
} else {
try {
/*该线程等待*/
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
/*偶数*/
public void even() {
synchronized (object){
while (i < 10) {
if (i % 2 == 0) {
System.out.println("偶数:" + i);
i++;
/*唤醒该线程*/
object.notify();
} else {
try {
/*该线程等待*/
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
ThreadCommunication threadCommunication = new ThreadCommunication();
Thread thread1 = new Thread("thread1"){
@Override
public void run() {
threadCommunication.odd();
}
};
Thread thread2 = new Thread("thread2"){
@Override
public void run() {
threadCommunication.even();
}
};
thread1.start();
thread2.start();
}
}
/*
* 若不用synchronized (object){} 则会抛出如下异常:java.lang.IllegalMonitorStateException
* 原因:
* 线程操作的wait()、notify()、notifyAll()方法只能在同步控制方法或同步控制块内调用。
* 如果在非同步控制方法或控制块里调用,程序能通过编译,
* 但运行的时候,将得到 IllegalMonitorStateException 异常
* */