声明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 译者:郑玉婷
监控Phaser类
Java 并发 API 提供的其中一个最复杂且强大的功能是使用 Phaser 类来执行同步phased任务。当有些任务可以分成步骤执行时,此机制是很有用的。Phaser类提供的同步线程机制是在每个步骤的末端, 所以全部的线程都完成第一步后,才能开始执行第二步。
在这个指南,你将学习如何从Phaser类获取其状态信息。
准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。
怎么做呢…
按照这些步骤来实现下面的例子:
02 |
public class Task implements Runnable {
|
08 |
private Phaser phaser;
|
11 |
public Task( int time, Phaser phaser) {
|
23 |
System.out.printf( "%s: Entering phase 1.\n" ,Thread. currentThread().getName());
|
25 |
TimeUnit.SECONDS.sleep(time);
|
26 |
} catch (InterruptedException e) {
|
29 |
System.out.printf( "%s: Finishing phase 1.\n" ,Thread. currentThread().getName());
|
30 |
phaser.arriveAndAwaitAdvance(); |
33 |
System.out.printf( "%s: Entering phase 2.\n" ,Thread. currentThread().getName());
|
35 |
TimeUnit.SECONDS.sleep(time);
|
36 |
} catch (InterruptedException e) {
|
39 |
System.out.printf( "%s: Finishing phase 2.\n" ,Thread. currentThread().getName());
|
40 |
phaser.arriveAndAwaitAdvance(); |
42 |
System.out.printf( "%s: Entering phase 3.\n" ,Thread. currentThread().getName());
|
44 |
TimeUnit.SECONDS.sleep(time);
|
45 |
} catch (InterruptedException e) {
|
48 |
System.out.printf( "%s: Finishing phase 3.\n" ,Thread. currentThread().getName());
|
50 |
phaser.arriveAndDeregister(); |
55 |
public static void main(String[] args) throws Exception {
|
58 |
Phaser phaser= new Phaser( 3 );
|
61 |
for ( int i= 0 ; i< 3 ; i++) {
|
62 |
Task task= new Task(i+ 1 , phaser);
|
63 |
Thread thread= new Thread(task);
|
68 |
for ( int i= 0 ; i< 10 ; i++) {
|
71 |
System.out.printf( "********************\n" );
|
72 |
System.out.printf( "Main: Phaser Log\n" );
|
73 |
System.out.printf( "Main: Phaser: Phase: %d\n" ,phaser.getPhase());
|
74 |
System.out.printf( "Main: Phaser: Registered Parties:%d\n" ,phaser.getRegisteredParties());
|
75 |
System.out.printf( "Main: Phaser: Arrived Parties:%d\n" ,phaser.getArrivedParties());
|
76 |
System.out.printf( "Main: Phaser: Unarrived Parties:%d\n" ,phaser.getUnarrivedParties());
|
77 |
System.out.printf( "********************\n" );
|
80 |
TimeUnit.SECONDS.sleep( 1 );
|
它是如何工作的…
在这个指南,我们在 Task 类实现了 phased 任务。此 phased 任务有3个phases,并使用Phaser接口来与其他Task对象同步。当这些任务正在执行他们的phases时候,主类运行3个任务并打印关于phaser对象的状态信息到操控台。 我们使用以下的方法来获取phaser对象的状态:
- getPhase():此方法返回phaser 任务的 actual phase
- getRegisteredParties(): 此方法返回使用phaser对象作为同步机制的任务数
- getArrivedParties(): 此方法返回已经到达actual phase末端的任务数
- getUnarrivedParties(): 此方法返回还没到达actual phase末端的任务数
以下的裁图展示了项目的部分输出:
参见
第三章,线程同步应用:运行阶段性并发任务
文章转自 并发编程网-ifeve.com