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)
原文:https://www.cnblogs.com/Leeyoung888/p/14588736.html