学习多线程之Phaser使用

简介: 学习多线程之Phaser使用

写在前面


今天我们来学习多线程中另一个工具,Phaser,一个比CyclicBarrier更灵活的工具,同CyclicBarrier一样,也是要保证所有线程同时到达某个点时才能继续执行。

下面就一起来看一下Phaser到底有哪些过人之处吧。


学习多线程之Phaser使用


Phaser虽然和CyclicBarrier工具都提供了差不多的功能,但是Phaser显然更加灵活,此工具更注重其的可重复使用的特征。

并且在这个特征上可以支持多个线程多次进行并发操作,提供了周期停顿的方法,可以中间停顿等待所有线程,并且这个周期可以是多个。

还是要从它的代码示例中才能更清楚的看出来,代码相对就比较复杂了,来一步步的看吧。

首先,来定义一下周期操作,这个过程需要继承Phaser类,如下代码:

public class TestPhaser extends Phaser {
    public boolean cycle(int cycleNum){
        boolean flag = false;
        if(cycleNum == 1){
            System.out.println("第一站"+getRegisteredParties());
        }else if(cycleNum == 2){
            System.out.println("第二站"+getRegisteredParties());
        }else if(cycleNum == 3){
            System.out.println("最后一站");
            flag = true;
        }
        return flag;
    }
}

通过这个周期,我们在定义一个方法来调用执行他。

public static void main(String[] args) {
    TestPhaser testPhaser = new TestPhaser();
    Thread thread0 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            testPhaser.register();
            System.out.println("thread0第一站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread0第二站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread0最后一站");
            testPhaser.arriveAndAwaitAdvance();
        }
    });
    Thread thread1 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            testPhaser.register();
            System.out.println("thread1第一站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread1第二站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread1最后一站");
            testPhaser.arriveAndAwaitAdvance();
        }
    });
    Thread thread2 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            testPhaser.register();
            System.out.println("thread2第一站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread2第二站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread2最后一站");
            testPhaser.arriveAndAwaitAdvance();
        }
    });
    Thread thread3 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            testPhaser.register();
            System.out.println("thread3第一站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread3第二站");
            testPhaser.arriveAndAwaitAdvance();
            System.out.println("thread3最后一站");
            testPhaser.arriveAndAwaitAdvance();
        }
    });
    thread0.start();
    thread1.start();
    thread2.start();
    thread3.start();
}

通过这个代码,我们可以得到如下的效果:

thread1第一站

thread3第一站

thread0第一站

thread2第一站

thread2第二站

thread1第二站

thread3第二站

thread0第二站

thread0最后一站

thread1最后一站

thread2最后一站

thread3最后一站

这个结果,是我们想要得到的效果,这几个线程,先执行了第一站,接着第二站,依次执行后得到了这个结果。

大家也可以自行去尝试一番。


相关文章
|
6月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
6月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
6月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
118 0
|
2月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
134 6
【Java学习】多线程&JUC万字超详解
|
5月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
127 0
|
5月前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
26 0
|
5月前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
183 0
|
6月前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
6月前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
64 2
|
6月前
|
安全 Java
java-多线程学习记录
java-多线程学习记录