首页 > 其他 > 详细

Phaser

时间:2021-03-28 17:57:46      阅读:16      评论:0      收藏:0      [点我收藏+]

1.arriveAndAwaitAdvance()方法

 1 package Three_Phaser_arriveAndDeregister;
 2 
 3 import java.util.concurrent.Phaser;
 4 
 5 public class Service {
 6 
 7     Phaser phaser;
 8 
 9     public Service(Phaser phaser) {
10         super();
11         this.phaser = phaser;
12     }
13 
14     public void methodA() throws InterruptedException {
15         System.out.println(Thread.currentThread().getName() + "赛程1 开始!!" + System.currentTimeMillis());
16         phaser.arriveAndAwaitAdvance();
17         System.out.println(Thread.currentThread().getName() + "赛程1 结束!!" + System.currentTimeMillis());
18         
19     }
20     
21 }
 1 package Three_Phaser_arriveAndDeregister;
 2 
 3 import java.util.concurrent.Phaser;
 4 
 5 public class ThreadA extends Thread {
 6 
 7     private Service service;
 8 
 9     public ThreadA(Service service) {
10         super();
11         this.service = service;
12     }
13 
14     public void run() {
15         try {
16             service.methodA();
17         } catch (InterruptedException e) {
18             // TODO Auto-generated catch block
19             e.printStackTrace();
20         }
21     }
22 }
23 -----------------------------------------------------------------------------------------
24 package Three_Phaser_arriveAndDeregister;
25 
26 import java.util.concurrent.Phaser;
27 
28 public class ThreadB extends Thread {
29 
30     private Service service;
31 
32     public ThreadB(Service service) {
33         super();
34         this.service = service;
35     }
36 
37     public void run() {
38         try {
39             service.methodA();
40         } catch (InterruptedException e) {
41             // TODO Auto-generated catch block
42             e.printStackTrace();
43         }
44     }
45 }
46 -----------------------------------------------------------------------------------------
47 package Three_Phaser_arriveAndDeregister;
48 
49 import java.util.concurrent.Phaser;
50 
51 public class ThreadC extends Thread {
52 
53     private Service service;
54 
55     public ThreadC(Service service) {
56         super();
57         this.service = service;
58     }
59 
60     public void run() {
61         try {
62             service.methodA();
63         } catch (InterruptedException e) {
64             // TODO Auto-generated catch block
65             e.printStackTrace();
66         }
67     }
68 }
 1 package Three_Phaser_arriveAndDeregister;
 2 
 3 import java.util.concurrent.Phaser;
 4 
 5 public class Run {
 6     public static void main(String[] args) {
 7         Phaser phaser = new Phaser(2);
 8         Service service = new Service(phaser);
 9 
10         ThreadA a = new ThreadA(service);
11         a.setName("A");
12 
13         ThreadB b = new ThreadB(service);
14         b.setName("B");
15 
16         ThreadC c = new ThreadC(service);
17         c.setName("C");
18 
19         a.start();
20         b.start();
21         c.start();
22     }
23 
24 }

  Phaser phaser = new Phaser(2);这里将参数设置成2(设置了2个parties),即等待两个线程同时到阻塞点后,再继续进行后面的程序,如果线程的数量大于参数的数量,则是两两为一组,到达阻塞点后再继续进行后序程序。

  而这里设置了3个线程,所以,只有其中的两个线程可以组合成功后继续下面的程序,而另外那个一个线程,将会被堵到阻塞点这里

技术分享图片

 

2.arriveAndAwaitDeregister()方法

  如果Phaser phaser = new Phaser(3),这里设置了3个parties,此时正有3个线程运行,倘若中途有一个线程退出,那么其他两个线程将会被永远堵在阻塞点处,此时,使用arriveAndAwaitDeregister()方法,那么带来的效果就是parties会执行减1的操作,此时,堵在阻塞点的那辆线程就可以继续往下执行。

 1 package Three_Phaser_arriveAndDeregister;
 2 
 3 import java.util.concurrent.Phaser;
 4 
 5 public class Service {
 6 
 7     Phaser phaser;
 8 
 9     public Service(Phaser phaser) {
10         super();
11         this.phaser = phaser;
12     }
13 
14     public void methodA() throws InterruptedException {
15         System.out.println(Thread.currentThread().getName() + "赛程1 开始!!" + System.currentTimeMillis());
16         phaser.arriveAndAwaitAdvance();
17         System.out.println(Thread.currentThread().getName() + "赛程1 结束!!" + System.currentTimeMillis());
18     
19         Thread.sleep(5000);
20         System.out.println(Thread.currentThread().getName() + "赛程2 开始!!" + System.currentTimeMillis());
21         phaser.arriveAndAwaitAdvance();
22         System.out.println(Thread.currentThread().getName() + "赛程2 结束!!" + System.currentTimeMillis());
23         
24     }
25     
26     
27 
28     public void methodC() throws InterruptedException {
29         System.out.println(Thread.currentThread().getName() + "赛程1 开始!!" + System.currentTimeMillis());
30         Thread.sleep(5000);
31         phaser.arriveAndAwaitAdvance();
32         System.out.println(Thread.currentThread().getName() + "赛程1 结束!!" + System.currentTimeMillis());
33         Thread.sleep(5000);
34         System.out.println(Thread.currentThread().getName()+"退出比赛!!!");
35         phaser.arriveAndDeregister();//使parties减1
36         /*
37         System.out.println(Thread.currentThread().getName() + "赛程2 开始!!" + System.currentTimeMillis());
38         Thread.sleep(5000);
39         phaser.arriveAndAwaitAdvance();
40         System.out.println(Thread.currentThread().getName() + "赛程2 结束!!" + System.currentTimeMillis());
41         */
42     }
43 
44 }

 

package Three_Phaser_arriveAndDeregister;

import java.util.concurrent.Phaser;

public class ThreadA extends Thread {

    private Service service;

    public ThreadA(Service service) {
        super();
        this.service = service;
    }

    public void run() {
        try {
            service.methodA();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
-----------------------------------------------------------------------------------------
package Three_Phaser_arriveAndDeregister;

import java.util.concurrent.Phaser;

public class ThreadB extends Thread {

    private Service service;

    public ThreadB(Service service) {
        super();
        this.service = service;
    }

    public void run() {
        try {
            service.methodA();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
-----------------------------------------------------------------------------------------
package Three_Phaser_arriveAndDeregister;

import java.util.concurrent.Phaser;

public class ThreadC extends Thread {

    private Service service;

    public ThreadC(Service service) {
        super();
        this.service = service;
    }

    public void run() {
        try {
            service.methodC();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
 1 package Three_Phaser_arriveAndDeregister;
 2 
 3 import java.util.concurrent.Phaser;
 4 
 5 public class Run {
 6     public static void main(String[] args) {
 7         Phaser phaser = new Phaser(3);
 8         Service service = new Service(phaser);
 9 
10         ThreadA a = new ThreadA(service);
11         a.setName("A");
12 
13         ThreadB b = new ThreadB(service);
14         b.setName("B");
15 
16         ThreadC c = new ThreadC(service);
17         c.setName("C");
18 
19         a.start();
20         b.start();
21         c.start();
22     }
23 
24 }

运行结果:

技术分享图片

  可以看到,虽然C线程中途退出,但是由于执行了arriveAndDeregister()方法,使得parties的数量由3减为2,所以,只需要凑够2个线程就可以越过阻塞点,结果表现为,其他两个线程越过阻塞点,顺利执行下面的程序。

(2)

 

Phaser

原文:https://www.cnblogs.com/Leeyoung888/p/14588736.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!