场景:
由于业务需要多线程并发操作,并且多线程之间是有一定的依赖关系,比如A线程存储数据,B线程则解析数据,即B线程是需要在A 线程执行完之后才开始执行,同样A线程存储数据的也需要B线程对数据解析完成后才开始存储新的数据,因此A与B两个线程就形成了交替实现,当然具体情况比这个复杂一些,但是大致逻辑类似。
过程就是:A=>B=>A=>B=>....如此循环...
其实该动作和队列类似,即生产者和消费者,队列长度确定,每生产一个就消费一个,确保消费完成后才生产,不过这次实现没有用到队列类库去实现,使用多线程亦可以完成,
于是可以使用synchronized和volatile来实现,
具体实现
1、具体业务处理类
public class ExChangeTest {
// 使用volatile变量来做判断
private volatile boolean isChange = true;
// 线程A业务处理,如:存储数据任务
public synchronized void methodA() throws Exception {
while (!isChange) {
// 等待
wait();
}
System.out.println("★★★★★");
isChange = false;
// 唤醒线程
notifyAll();
}
// 线程B业务处理,如:解析数据任务
public synchronized void methodB() throws Exception {
while (isChange) {
wait();
}
System.out.println("☆☆☆☆☆");
isChange = true;
notifyAll();
}
}
2、创建A和B两个线程
public class ThreadA extends Thread {
private ExChangeTest change;
public ThreadA(ExChangeTest change) {
this.change = change;
}
public void run() {
try {
change.methodA();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ThreadB extends Thread {
private ExChangeTest change;
public ThreadB(ExChangeTest change) {
this.change = change;
}
public void run() {
try {
change.methodB();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、运行入口Client
public class Client {
public static void main(String[] args) {
// 创建具体业务逻辑处理类
ExChangeTest tool = new ExChangeTest();
// 创建5个线程,A与B线程各5个,分别交替执行
for (int i = 1; i < 6; i++) {
ThreadA tA = new ThreadA(tool);
tA.start();
ThreadB tB = new ThreadB(tool);
tB.start();
}
}
}
以上代码运行之后,完成实现线程交替动作,如下输出:
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆