原创转载请注明出处:http://agilestyle.iteye.com/blog/2344661
awaitAdvance(int phase)
awaitAdvance(int phase)作用是如果传入参数phase值和当前getPhase()返回值一样,则在屏障处等待,否则立刻返回执行下面的代码
PhaserTest11.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
public class PhaserTest11 {
public static class ThreadA implements Runnable {
private Phaser phaser;
public ThreadA(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
}
}
public static class ThreadB implements Runnable {
private Phaser phaser;
public ThreadB(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
}
}
public static class ThreadC implements Runnable {
private Phaser phaser;
public ThreadC(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
Thread.sleep(3000);
System.out.println("phaser.getPhase()=" + phaser.getPhase());
phaser.awaitAdvance(0);
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static class ThreadD implements Runnable {
private Phaser phaser;
public ThreadD(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
Thread.sleep(5000);
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
Thread t2 = new Thread(new ThreadB(phaser));
Thread t3 = new Thread(new ThreadC(phaser));
Thread t4 = new Thread(new ThreadD(phaser));
t1.setName("ThreadA");
t2.setName("ThreadB");
t3.setName("ThreadC");
t4.setName("ThreadD");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
Run
Note:
awaitAdvance(int phase)并不参与parties计数的操作,仅仅具有判断的功能
更改ThreadC,将
phaser.awaitAdvance(0);
改为
phaser.awaitAdvance(1);
再Run
Note:
由于传入参数phase值和当前getPhase()返回值不一致,则立即返回
awaitAdvanceInterruptibly(int phase)
awaitAdvanceInterruptibly(int phase)作用是传入参数phase值和当前getPhase()返回值不一致时,则继续执行下面的代码
PhaserTest14.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
public class PhaserTest14 {
public static class ThreadA implements Runnable {
private Phaser phaser;
public ThreadA(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
System.out.println("phaser.getPhase()=" + phaser.getPhase());
phaser.awaitAdvanceInterruptibly(10);
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
} catch (InterruptedException e) {
System.out.println("InterruptedException invoked...");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
}
}
Run
Note:
由于传入参数phase值和当前getPhase()返回值不一致,控制台程序快速继续向下执行,运行的时间几乎是一样的
awaitAdvance(int phase)是不可中断的
PhaserTest12.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
public class PhaserTest12 {
public static class ThreadA implements Runnable {
private Phaser phaser;
public ThreadA(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
System.out.println("phaser.getPhase()=" + phaser.getPhase());
phaser.awaitAdvance(0);
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
}
}
public static void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
Thread.sleep(3000);
t1.interrupt();
System.out.println("interrupt() invoked..");
} catch (InterruptedException e) {
System.out.println("InterruptedException invoked...");
e.printStackTrace();
}
}
}
Run
Note:
控制台没有出现异常,说明线程并未中断
awaitAdvanceInterruptibly(int phase)是可中断的
PhaserTest13.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
public class PhaserTest13 {
public static class ThreadA implements Runnable {
private Phaser phaser;
public ThreadA(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
System.out.println("phaser.getPhase()=" + phaser.getPhase());
phaser.awaitAdvanceInterruptibly(0);
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
} catch (InterruptedException e) {
System.out.println("InterruptedException invoked...");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
Thread.sleep(5000);
t1.interrupt();
System.out.println("interrupt() invoked..");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run
Note:
控制台出现异常,线程被中断了
awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit)
awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit)作用是在指定的Phase等待最大的单位时间,如果在指定的时间内,Phase值未变,则出现异常,否则继续向下运行。
PhaserTest15.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class PhaserTest15 {
public static class ThreadA implements Runnable {
private Phaser phaser;
public ThreadA(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " A1 begin " + System.currentTimeMillis());
System.out.println("phaser.getPhase()=" + phaser.getPhase());
phaser.awaitAdvanceInterruptibly(0, 5, TimeUnit.SECONDS);
System.out.println(Thread.currentThread().getName() + " A1 end " + System.currentTimeMillis());
} catch (InterruptedException e) {
System.out.println("InterruptedException invoked...");
e.printStackTrace();
} catch (TimeoutException e) {
System.out.println("TimeoutException invoked...");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
}
}
Run
Note:
出现了超时异常,因为5秒之后phase值并没有发生改变
修改main方法
public static void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
System.out.println("phaser.getArrivedParties()=" + phaser.getArrivedParties());
Thread.sleep(1000);
phaser.arrive();
System.out.println("phaser.getArrivedParties()=" + phaser.getArrivedParties());
Thread.sleep(1000);
phaser.arrive();
System.out.println("phaser.getArrivedParties()=" + phaser.getArrivedParties());
Thread.sleep(1000);
phaser.arrive();
System.out.println("phaser.getArrivedParties()=" + phaser.getArrivedParties());
Thread.sleep(3000);
System.out.println("phaser.getPhase()=" + phaser.getPhase());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
再Run
Note:
5秒之后phase值发生改变,继续向下运行
再次修改main方法
public static void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
Thread.sleep(1000);
t1.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
再Run
Note:
提前将还未到达5秒的线程进行了中断
Reference
Java并发编程核心方法与框架