当前位置:嗨网首页>书籍在线阅读

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