多线程交替执行

场景:

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

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

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








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值