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);
}
}
}