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