一、场景:
多线程之间通讯其实就是多个线程操作同一个资源,但是动作不同。
二、案例
/**
* @author: _无邪
* @date: 2021-02-23 11:23
* @Description: 线程通信
* 负载均衡算法 轮询
* count = (count + 1) % 2;
*/
public class Thread04 {
private Res res = new Res();
// 两个线程一个执行读操作 一个执行写操作 同时操作同一个资源res
class Res {
private String username;
private String sex;
private boolean flag;
}
class writeOper implements Runnable {
public int count = 0;
public Res res;
public writeOper(Res res) {
this.res = res;
}
/**
* 使用object锁,两个对象共享共一个res ,必须使用同一个object锁
*/
@Override
public void run() {
while (true) {
// 添加res对象锁
synchronized (res) {
if (res.flag) {
try {
res.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (count == 0) {
res.username = "程鹏";
res.sex = "男";
} else {
res.username = "小小";
res.sex = "女";
}
// 负载均衡算法 轮询 写一次 读一次
count = (count + 1) % 2;
res.flag = true;
res.notify();
}
}
}
}
class readOper implements Runnable {
private Res res;
public readOper(Res res) {
this.res = res;
}
@Override
public void run() {
while (true) {
synchronized (res) {
if (!res.flag) {
try {
res.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(res.username + "," + res.sex);
res.flag = false;
res.notify();
}
}
}
}
public void start() {
Res res = new Res();
// 线程读操作
writeOper writeOper = new writeOper(res);
// 线程写操作
readOper readOper = new readOper(res);
new Thread(writeOper).start();
new Thread(readOper).start();
}
public static void main(String[] args) {
new Thread04().start();
}
}