多线程交替执行

来源:互联网 发布:手机游戏端口 编辑:程序博客网 时间:2024/06/06 13:10

场景:

由于业务需要多线程并发操作,并且多线程之间是有一定的依赖关系,比如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();}}}

以上代码运行之后,完成实现线程交替动作,如下输出:

★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆
★★★★★
☆☆☆☆☆