08-案例实现
案例实现
按照以下步骤完成本案例。
1.创建 Task 类,该类实现了 Runnable 接口:
public class Task implements Runnable {
2.声明一个整型的私有属性 time :
private final int time;
3.声明一个 Phaser 类型的私有属性 phaser :
private final Phaser phaser;
4.实现该类的构造函数以初始化其属性:
public Task(int time, Phaser phaser) {
this.time=time;
this.phaser=phaser;
}
5.实现 run() 方法。在该方法内部,使用 phaser 对象上的 arrive() 方法开始执行任务:
@Override
public void run() {
phaser.arrive();
6.在控制台中输出一行提示信息以表示开始第一阶段的任务。在线程休眠达到 time 属性指定的秒数后,线程将在控制台中输出信息以表示第一阶段结束。随后,使用 phaser 属性上的 arriveAndAwaitAdvance() 方法与其余任务同步:
System.out.printf("%s: Entering phase 1.\n",
Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s: Finishing phase 1.\n",
Thread.currentThread().getName());
phaser.arriveAndAwaitAdvance();
7.在线程执行的第二和第三阶段中,重复上述工作,但有所不同的是,第三阶段的结尾使用 arriveAndDeregister() 方法而不是 arriveAndAwaitAdvance() 方法:
System.out.printf("%s: Entering phase 2.\n",
Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s: Finishing phase 2.\n",
Thread.currentThread().getName());
phaser.arriveAndAwaitAdvance();
System.out.printf("%s: Entering phase 3.\n",
Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("%s: Finishing phase 3.\n",
Thread.currentThread().getName());
phaser.arriveAndDeregister();
8.实现本案例的主类,新建 Main 类和 main() 方法:
public class Main {
public static void main(String[] args) throws Exception {
9.创建有将3个参与者的 Phaser 类型的对象 phaser :
Phaser phaser=new Phaser(3);
10.创建并启动3个线程来执行3个任务对象:
for (int i=0; i<3; i++) {
Task task=new Task(i+1, phaser);
Thread thread=new Thread(task);
thread.start();
}
11.用10步创建一个循环,以输出 phaser 对象信息:
for (int i=0; i<10; i++) {
12.分别输出已注册的参与者、当前 phaser 所处的阶段、已抵达的参与者以及尚未抵达的参与者信息:
System.out.printf("********************\n");
System.out.printf("Main: Phaser Log\n");
System.out.printf("Main: Phaser: Phase: %d\n",
phaser.getPhase());
System.out.printf("Main: Phaser: Registered Parties: %d\n",
phaser.getRegisteredParties());
System.out.printf("Main: Phaser: Arrived Parties: %d\n",
phaser.getArrivedParties());
System.out.printf("Main: Phaser: Unarrived Parties: %d\n",
phaser.getUnarrivedParties());
System.out.printf("********************\n");
13.让线程休眠1s,并关闭循环和类:
TimeUnit.SECONDS.sleep(1);
}
}
}