- 大家都知道线程的运行是随机的,由操作系统来控制,那我们怎么让他们“听话”呢,这就是线程之间的通信问题
- 线程之间如何建立一种联系 进行通信呢,我们写一个小程序来理解
线程A输出 1 然后线程B再输出 a
A -> 1 B -> a ; A -> 2 B ->b;
线程之间的通信
A - B 联系(通信)方式 -> 同步锁 同一个东西
Object类的方法
注意:这三个方法必须由同步监视器来调用 必须用同一个锁
wait() -> 让某个线程等待 进入阻塞队列
notify() -> 让某个线程唤醒
notifyAll() -> 唤醒多个线程
public class MainClass {
static int state = 1; // 标识符
static Object object = new Object();
public static void main(String[] args){
new Thread(new Runnable() {
int num = 1;
@Override
public void run() {
// 输出数字
while (true){
synchronized (object) {
// 判断当前是不是在输出字母
if (state != 1) {
// 当前这个线程需要等待一下
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 输出数字
System.out.print(" "+num);
num++;
// 唤醒当前object锁上的其他等待的线程
state = 2;
object.notify();
}
}
}
}).start();
new Thread(new Runnable() {
char alpha = 'a';
@Override
public void run() {
// 输出字母
while (true){
synchronized (object) {
// 判断当前是不是在输出数字
if (state != 2) {
// 当前这个线程需要等待一下
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(Character.toChars(alpha ));
alpha++;
if (alpha > 'z'){
break;
}
// 唤醒当前object锁上的其他等待的线程
state = 1;
object.notify();
}
}
}
}).start();
}