1. Pasher基础知识
register()
的次数要和arriveAndAwaitAdvance()
的次数一致;或者通过new Phaser(int phaser);
来指定register的次数。- 可以通过
arriveAndDeregister()
来减少register。 - 可以通过
forceTermination
来强制把所有的wait的线程都接着执行,去除了wait状态。
1. 使用Phaser模仿CountDownLatch操作.
public class PhaserDemo1 {
private static final Random random = new Random(System.currentTimeMillis());
public static void main(String[] args) {
final Phaser phaser = new Phaser();
IntStream.rangeClosed(1, 5).boxed().map(item -> phaser).forEach(Task::new);
phaser.register();
phaser.arriveAndAwaitAdvance();
System.out.println("All work is finished!");
}
private static class Task extends Thread {
private final Phaser phaser;
public Task(Phaser phaser) {
this.phaser = phaser;
this.phaser.register();
start();
}
@Override
public void run() {
System.out.println(getName() + " is working.... ");
try {
TimeUnit.SECONDS.sleep(random.nextInt(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
this.phaser.arriveAndAwaitAdvance();
}
}
}
2. 使用Phaser模仿CyclicBarrier操作.
public class PhaserDemo2 {
private static final Random random = new Random(System.currentTimeMillis());
public static void main(String[] args) {
final Phaser phaser = new Phaser(5);
for (int i = 0; i < 5; i++) {
new SportMen(phaser, i).start();
}
}
private static class SportMen extends Thread {
private final Phaser phaser;
private final int no;
public SportMen(Phaser phaser, int no) {
this.phaser = phaser;
this.no = no;
}
@Override
public void run() {
System.out.println(this.no + " start running..");
sleep();
System.out.println(this.no + " end running..");
this.phaser.arriveAndAwaitAdvance();
System.out.println(this.no + " start bicycle..");
sleep();
System.out.println(this.no + " end bicycle..");
this.phaser.arriveAndAwaitAdvance();
System.out.println(this.no + " start jump..");
sleep();
System.out.println(this.no + " end jump..");
this.phaser.arriveAndAwaitAdvance();
}
private void sleep() {
try {
TimeUnit.SECONDS.sleep(random.nextInt(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
3. 监听第一部分任务是否完成.
public class PhaserDemo3 {
private static final Random random = new Random(System.currentTimeMillis());
public static void main(String[] args) {
int max = 5;
final Phaser phaser = new Phaser(max);
for (int i = 1; i < max; i++) {
new SportMen(phaser, i).start();
}
phaser.arriveAndAwaitAdvance();
System.out.println("First work is finished!");
}
private static class SportMen extends Thread {
private final Phaser phaser;
private final int no;
public SportMen(Phaser phaser, int no) {
this.phaser = phaser;
this.no = no;
}
@Override
public void run() {
System.out.println(this.no + " start running..");
sleep();
this.phaser.arrive();
System.out.println(this.no + " end running..");
}
private void sleep() {
try {
TimeUnit.SECONDS.sleep(random.nextInt(5));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}