并发编程--并发阶段任务的运行

本文介绍Java并发API中的Phaser类,一种适用于多阶段任务的同步工具。通过实例演示如何利用Phaser实现矩阵搜索任务的阶段式同步,并讨论其动态调整特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java并发Api提供了一个更复杂、更强大的同步辅助类,即Phaser,它允许执行并发多阶段任务。当我们有并发任务并且需要分解成几步执行时,这种机制就非常适用。Phaser类机制是在每一步结束的位置对线程进行同步,当所有的线程完成了这一步,才允许执行下一步。

跟其他同步工具一样,必须对Phaser类中参与同步操作的任务数进行初始化,不同的是,我们可以动态地增加或者减少任务数。

下面例子是查矩阵包含某元素的个数,我们分别启动3个线程,每个线程计算该矩阵一行包含某元素的个数,这个过程分成两个阶段,第一个阶段是获得该矩阵的行,第二阶段是计算该行包含某元素的个数,三个线程在并发执行每个阶段进行同步,然后把结果放在线程共享变量LinkList中




启动线程thread0,thread1,thread2后,三个线程执行run先执行getRow方法,getRow方法内部使用了Phaser.arriveAndAwaitAdvance(),保证了三个线程同步开始执行getRow方法,在同一个起跑线上,然后再执行filterRow方法,过滤出某行包含某元素的个数,同样使用了Phaser.arriveAndAwaitAdvance(),先执行到该阶段的线程先等待其他线程到达该阶段,然后再一起执行,如果某个线程在搜素矩阵某行发现没有某元素,就调用Phaser.arriveAndDeregister()方法,顾名思义,就是某线程到达某种结果或者某个阶段(这里就是没有搜索到某元素),就解除注册在Phaser中的线程,这时候Phaser的计数器会减一,在下一次调用Phaser.arriveAndAwaitAdvance()时,它就知道只需要再等待多少个线程到达才开始执行下一阶段。

自己也可以编写自定义的Phaser,只要继承Phaser类,同时可以覆盖Phaser类的方法,比如覆盖onAdvance方法,在线程在每个阶段切换的时候执行onAdvance方法相关的代码。这个很实用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值