Phaser

0
23 май 2015 16:04
Здравствуйте подскажите пожалуйста почему пропускает отображение нулевой и второй фазы
Код и вывод ниже
package ru.tsalger;

import java.util.concurrent.*;

//расширение класса Phaser и переопределение метода onAdvance  так
// чтобы было выполнено только определенное количество фаз


//расширение класса MyPhaser чтобы позволить выполнять только 
//определенное количество фаз
class MyPhaser extends Phaser {
	int numPhases;
	
	MyPhaser(int parties, int phaseCount){
		super(parties);
		numPhases = phaseCount -1;
	}
	//переопределить метод onAdvance чтобы выполнять
	//определенное количество фаз
	protected boolean onAdvance(int p, int regParties){
		//этот оператор println  нужен только для иллюстрации 
		//обычно метод onAdvance не отображает вывод
		System.out.println("Phase " + p + " completed.\n");
		//если все фазы закончены возвратить true
		if(p == numPhases || regParties == 0) return true;
		//в противном случае вернуть false
		return false;
	}
}
class PhaserDemo2{
	public static void main(String args[]){
		MyPhaser phsr = new  MyPhaser(1, 4);
		System.out.println("Starting\n");
		new MyThread(phsr, "A");
		new MyThread(phsr, "B");
		new MyThread(phsr, "C");
		
		//Ожидать завершения определенного количества фаз
		while(!phsr.isTerminated()){
			phsr.arriveAndAwaitAdvance();
		}
		System.out.println("The Phaser is terminated");
	}
}
//поток выполнения использующий Phaser
class MyThread implements Runnable{
	Phaser phsr;
	String name;
	
	MyThread(Phaser p, String n){
		phsr = p;
		name = n;
		phsr.register();
		new Thread(this).start();
	}
	public void run(){
		while(!phsr.isTerminated()){
			System.out.println("Thread " + name + " Begining Phase "
					+ phsr.arriveAndAwaitAdvance());
			phsr.arriveAndAwaitAdvance();
			//небольшая пауза для предотвращения перемешанного вывода 
			//только для иллюстрации. это не обязательно для правильной работы фазера
			
			try{
				Thread.sleep(10);
			}catch(InterruptedException e){
				System.out.println(e);
			}
		}
	}
}


Вывод:
Starting

Phase 0 completed.

Thread B Begining Phase 1
Thread C Begining Phase 1
Thread A Begining Phase 1
Phase 1 completed.

Phase 2 completed.

Thread C Begining Phase 3
Thread B Begining Phase 3
Thread A Begining Phase 3
Phase 3 completed.

The Phaser is terminated

Ответов: 1

0
13 ноя 2015 16:00
/ Java. Полное руководство. 8-е издание.pdf Текст там взят там все и расказано, не понятен смысл поста
Модераторы: Нет
Сейчас эту тему просматривают: Нет