Concurrent - Phaser - forceTermination() & isTerminated()
原创转载请注明出处:http://agilestyle.iteye.com/blog/2344789
forceTermination()
forceTermination()的作用是使Phaser对象的屏障功能失效
isTerminated()
isTerminated()的作用是判断Phaser对象是否已经呈销毁状态
PhaserTest18.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
public class PhaserTest18 {
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 void main(String[] args) {
Phaser phaser = new Phaser(3);
Thread t1 = new Thread(new ThreadA(phaser));
t1.setName("ThreadA");
t1.start();
Thread t2 = new Thread(new ThreadB(phaser));
t2.setName("ThreadB");
t2.start();
}
}
Run
Note:
ThreadA和ThreadB呈阻塞状态,因为计数未达到3
修改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 t2 = new Thread(new ThreadB(phaser));
t2.setName("ThreadB");
t2.start();
Thread.sleep(1000);
phaser.forceTermination();
System.out.println(phaser.isTerminated());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
再Run
Note:
forceTermination()仅仅将屏障取消,线程继续执行后面的代码,并不出现异常,而CyclicBarrier的reset()方法执行时会出现异常。
控制Phaser类的运行时机
控制线程一起到达屏障后不允许继续运行
PhaserTest20.java
package org.fool.java.concurrent.phaser;
import java.util.concurrent.Phaser;
public class PhaserTest20 {
public static class MyThread implements Runnable {
private Phaser phaser;
public MyThread(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 void main(String[] args) {
try {
Phaser phaser = new Phaser(3);
System.out.println(phaser.getRegisteredParties());
phaser.register();
System.out.println(phaser.getRegisteredParties());
for (int i = 0; i < 3; i++) {
Thread t = new Thread(new MyThread(phaser));
t.start();
}
Thread.sleep(5000);
System.out.println("wait for 5 seconds...");
phaser.arriveAndDeregister();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Run
Note:
本例说明Phaser类运行的时机是可以逻辑控制的,主要的原理就是计数+1,然后通过逻辑代码的方式来决定线程是否继续向下运行。
Reference
Java并发编程核心方法与框架