Java 并发编程学习笔记(10) ----Phaser-getPhaser(),onAdvance(),arrive()

1.getPhaser()和onAdvance()方法

getPhaser() 获取的是已经到达第几个屏障
onAdvance() 在通过新的屏障时被调用;返回true时,取消屏障

2.代码


package com.lhc.concurrent.phaser.onAdvice;

import java.util.concurrent.Phaser;

public class MyService {
    private Phaser phaser;

    public MyService(Phaser phaser) {
        this.phaser = phaser;
    }

    public void doSomething(){
        try{
            System.out.println("A begin, ThreadName = " + Thread.currentThread().getName() + System.currentTimeMillis());
            if("myThread2".equals(Thread.currentThread().getName())){
                Thread.sleep(4000);
            }
            phaser.arriveAndAwaitAdvance();
            System.out.println("A end, ThreadName = " + Thread.currentThread().getName() + " ,end phaser value = " +
                    phaser.getPhase() + " " + System.currentTimeMillis());

            System.out.println("B begin, ThreadName = " + Thread.currentThread().getName() + System.currentTimeMillis());
            if("myThread2".equals(Thread.currentThread().getName())){
                Thread.sleep(4000);
            }
            phaser.arriveAndAwaitAdvance();
            System.out.println("B end, ThreadName = " + Thread.currentThread().getName() + " ,end phaser value = " +
                    phaser.getPhase() + " " + System.currentTimeMillis());

            System.out.println("C begin, ThreadName = " + Thread.currentThread().getName() + System.currentTimeMillis());
            if("myThread2".equals(Thread.currentThread().getName())){
                Thread.sleep(4000);
            }
            phaser.arriveAndAwaitAdvance();
            System.out.println("C end, ThreadName = " + Thread.currentThread().getName() + " ,end phaser value = " +
                    phaser.getPhase() + " " + System.currentTimeMillis());

        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

3.测试类


package com.lhc.concurrent.phaser.onAdvice;

import java.util.concurrent.Phaser;

public class MyThread extends Thread{
    private MyService myService;

    public MyThread(MyService myService) {
        this.myService = myService;
    }

    @Override
    public void run() {
        myService.doSomething();
    }

    public static void main(String[] args){
        Phaser phaser = new Phaser(2){
            @Override
            protected boolean onAdvance(int phase, int registeredParties) {
                System.out.println("onAdvice() 方法被调用");
                return true;
            }
        };

        MyService myService = new MyService(phaser);

        MyThread myThread1 = new MyThread(myService);
        myThread1.setName("myThread1");
        MyThread myThread2 = new MyThread(myService);
        myThread2.setName("myThread2");
        myThread1.start();
        myThread2.start();
    }
}

4.输出结果

A begin, ThreadName = myThread1 1556536238588
A begin, ThreadName = myThread2 1556536238588
onAdvice() 方法被调用
A end, ThreadName = myThread2 ,end phaser value = -2147483647 1556536242598
A end, ThreadName = myThread1 ,end phaser value = -2147483647 1556536242598
B begin, ThreadName = myThread1 1556536242598
B begin, ThreadName = myThread2 1556536242598
B end, ThreadName = myThread1 ,end phaser value = -2147483647 1556536242598
C begin, ThreadName = myThread1 1556536242598
C end, ThreadName = myThread1 ,end phaser value = -2147483647 1556536242598
B end, ThreadName = myThread2 ,end phaser value = -2147483647 1556536246610
C begin, ThreadName = myThread2 1556536246610
C end, ThreadName = myThread2 ,end phaser value = -2147483647 1556536250614

21.arrive()方法

使parties值加1,并且不在屏障处等待,直接向后面的逻辑继续运行,并且Phaser类有计数重置功能

22.代码


package com.lhc.concurrent.phaser.arrive;

import java.util.concurrent.Phaser;

public class MyService {
    public Phaser phaser;

    public MyService(Phaser phaser) {
        super();
        this.phaser = phaser;
    }

    public void testA() {
        try {
            System.out.println(Thread.currentThread().getName() + " begin a1 " + System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName() + " end a1 " + System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName() + " begin a2 " + System.currentTimeMillis());
            Thread.sleep(5000);
            phaser.arriveAndAwaitAdvance();
            System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
            System.out.println(Thread.currentThread().getName() + " end a2 " + System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName() + " begin a3 " + System.currentTimeMillis());
            Thread.sleep(5000);
            phaser.arriveAndAwaitAdvance();
            System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
            System.out.println(Thread.currentThread().getName() + " end a3 " + System.currentTimeMillis());

        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public void testC() {
        try {
            System.out.println(Thread.currentThread().getName() + " begin c1 " + System.currentTimeMillis());
            Thread.sleep(10000);
            System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName() + " end c1 " + System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName() + " begin c2 " + System.currentTimeMillis());
            Thread.sleep(10000);
            phaser.arriveAndAwaitAdvance();
            System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
            System.out.println(Thread.currentThread().getName() + " end c2 " + System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName() + " begin c3 " + System.currentTimeMillis());
            Thread.sleep(10000);
            phaser.arriveAndAwaitAdvance();
            System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
            System.out.println(Thread.currentThread().getName() + " end c3 " + System.currentTimeMillis());

        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public void testB() {
        System.out.println(Thread.currentThread().getName() + " begin b1 " + System.currentTimeMillis());
        phaser.arrive();
        System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
        System.out.println(Thread.currentThread().getName() + " end b1 " + System.currentTimeMillis());

        System.out.println(Thread.currentThread().getName() + " begin b2 " + System.currentTimeMillis());
        phaser.arrive();
        System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
        System.out.println(Thread.currentThread().getName() + " end b2 " + System.currentTimeMillis());

        System.out.println(Thread.currentThread().getName() + " begin b3 " + System.currentTimeMillis());
        phaser.arrive();
        System.out.println("Parties:" + phaser.getArrivedParties() + ",Phase:" + phaser.getPhase());
        System.out.println(Thread.currentThread().getName() + " end b3 " + System.currentTimeMillis());
    }
}

23.测试


package com.lhc.concurrent.phaser.arrive;

import java.util.concurrent.Phaser;

public class MyThread extends Thread {
    private MyService myService;

    public MyThread(MyService myService, String name) {
        super();
        this.myService = myService;
        this.setName(name);
    }

    @Override
    public void run() {
        if (Thread.currentThread().getName().contains("A")) {
            myService.testA();
        } else if (Thread.currentThread().getName().contains("B")) {
            myService.testB();
        } else {
            myService.testC();
        }
    }

    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);
        MyService myService = new MyService(phaser);

        MyThread a = new MyThread(myService, "A");
        a.start();
        MyThread c = new MyThread(myService, "C");
        c.start();
        MyThread b = new MyThread(myService, "B");
        b.start();
    }
}

24.输出结果

A begin a1 1556537379472
B begin b1 1556537379472
C begin c1 1556537379472
Parties:1,Phase:0
B end b1 1556537379472
B begin b2 1556537379472
Parties:2,Phase:0
B end b2 1556537379472
B begin b3 1556537379472
Parties:0,Phase:1
B end b3 1556537379472
Parties:0,Phase:1
Parties:1,Phase:1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值