public class Phaser extends Object
CyclicBarrierããã³CountDownLatchãšåæ§ã§ãããããæè»ãªäœ¿ç𿹿³ããµããŒãããŸãã
ç»é²ã ä»ã®ããªã¢ãŒã®å Žåãšã¯ç°ãªãããã§ãŒã¶äžã§åæããšãããã«ç»é²ãããããŒãã£ã®æ°ã¯ãæéãšãšãã«å€åããããšããããŸãã ã¿ã¹ã¯ã¯(ã¡ãœããregister()ãbulkRegister(int)ããŸãã¯ããŒãã£ã®åæã®æ°ã確ç«ããã³ã³ã¹ãã©ã¯ã¿ã®åœ¢åŒã䜿çšããŠ)ãã€ã§ãç»é²ã§ããä»»æã®å°çæã«(arriveAndDeregister()ã䜿çšããŠ)å¿
èŠã«å¿ããŠç»é²ãè§£é€ã§ããŸãã ãã£ãšãåºæ¬çãªåææ§é ãšåæ§ã«ãç»é²ãšç»é²è§£é€ã¯å
éšã®ã«ãŠã³ãã«ãã圱é¿ãäžããŸããããã以äžã®å
éšç»é²ã¯ç¢ºç«ãããªããããã¿ã¹ã¯ã¯ãèªèº«ãç»é²ãããŠãããã©ãããç
§äŒã§ããŸããã (ãã ãããã®ã¯ã©ã¹ã®ãµãã¯ã©ã¹åã«ãã£ãŠãã®ãããªç»é²ãå°å
¥ã§ããŸãã)
åæã CyclicBarrierãšåæ§ã«ãPhaserã¯ç¹°è¿ãåŸ
æ©ã§ããŸãã arriveAndAwaitAdvance()ã¡ãœããã«ã¯ãCyclicBarrier.awaitã«é¡äŒŒãã广ããããŸãã ãã§ãŒã¶ã®åäžä»£ã«ã¯ãé¢é£ä»ãããããã§ãŒãºçªå·ããããŸãã ãã®ãã§ãŒãºçªå·ã¯0ããå§ãŸãããã¹ãŠã®ããŒãã£ããã§ãŒã¶ã«å°çãããšé²ããããInteger.MAX_VALUEã«éãããš0ã«ã©ãããããŸãã ãã§ãŒãºçªå·ã䜿çšãããšãç»é²ãããããããã®ããŒãã£ããåŒã³åºãããšã®ã§ãã2çš®é¡ã®ã¡ãœãããéããŠããã§ãŒã¶ãžã®å°çæããã»ããåŸ
æ©ããŠãããšãã®ã¢ã¯ã·ã§ã³ãåå¥ã«å¶åŸ¡ã§ããŸãã
arrive()ã¡ãœãããšarriveAndDeregister()ã¡ãœããã¯ãå°çãèšé²ããŸãã ãããã®ã¡ãœããã¯ãããã¯ãè¡ãããé¢é£ä»ããããå°çãã§ãŒãºçªå·ãã€ãŸãããã®å°çãé©çšããããã§ãŒã¶ã®ãã§ãŒãºçªå·ãè¿ããŸãã ç¹å®ã®ãã§ãŒãºã®æåŸã®ããŒãã£ãå°çãããšããªãã·ã§ã³ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã§ãŒãºãé²ããããŸãã ãããã®ã¢ã¯ã·ã§ã³ã¯ããã§ãŒãºãããªã¬ãŒããŠé²ããããŒãã£ã«ãã£ãŠå®è¡ãããçµäºãå¶åŸ¡ãããªãŒããŒã©ã€ãã»ã¡ãœããonAdvance(int, int)ã«ãã£ãŠèª¿æŽãããŸãã ãã®ã¡ãœããã®ãªãŒããŒã©ã€ãã¯CyclicBarrierãžã®ããªã¢ãŒã»ã¢ã¯ã·ã§ã³ã®æäŸã«äŒŒãŠããŸãããããããæè»ã§ãã
awaitAdvance(int)ã¡ãœããã¯ãå°çãã§ãŒãºçªå·ã瀺ãåŒæ°ãå¿
èŠãšãããã§ãŒã¶ãå¥ã®ãã§ãŒãºã«é²ããš(ãŸãã¯ããã§ã«ãã®ãã§ãŒãºã«ãããšãã¯)埩垰ããŸãã CyclicBarrierã䜿çšããé¡äŒŒã®æ§ç¯ãšã¯ç°ãªããawaitAdvanceã¡ãœããã¯ãåŸ
æ©äžã®ã¹ã¬ãããå²ã蟌ãŸããå Žåã§ãåŒãç¶ãåŸ
æ©ããŸãã å²èŸŒã¿å¯èœãªããŒãžã§ã³ãã¿ã€ã ã¢ãŠãã»ããŒãžã§ã³ã䜿çšã§ããŸãããã¿ã¹ã¯ãå²èŸŒã¿å¯èœãªç¶æ
ãŸãã¯ã¿ã€ã ã»ã¢ãŠãã§åŸ
æ©äžã«æ€åºãããäŸå€ã«ãã£ãŠããã§ãŒã¶ã®ç¶æ
ã¯å€æŽãããŸããã å¿
èŠã«å¿ããŠããã°ãã°forceTerminationãåŒã³åºããããšã«ããããã®äŸå€ã®ãã³ãã©å
ã§é¢é£ããä»»æã®å埩ãå®è¡ã§ããŸãã ãŸãããã§ãŒã¶ã¯ãForkJoinPoolã§å®è¡ãããŠããã¿ã¹ã¯ã§ã䜿çšã§ããŸããããã«ãããä»ã®ã¿ã¹ã¯ããã§ãŒãºãé²ãã®ãåŸ
æ©ããŠãããã¯ãããŠãããšãã«ã¿ã¹ã¯ãå®è¡ããããã®ååãªäžŠåæ§ã確ä¿ãããŸãã
çµäºã ãã§ãŒã¶ã¯çµäºç¶æ
ã«å
¥ãããšããããããã¯isTerminated()ã¡ãœããã䜿çšããŠãã§ãã¯ã§ããŸãã çµäºæã¯ãè² ã®æ»ãå€ã§ç€ºãããããã«ããã¹ãŠã®åæã¡ãœãããããã§ãŒãºãé²ãã®ãåŸ
æ©ããã«ãã ã¡ã«åŸ©åž°ããŸãã åæ§ã«ãçµäºæã«ç»é²ããããšããŠã广ã¯ãããŸããã çµäºã¯ãonAdvanceã®åŒåºããtrueãè¿ãããšãã«ããªã¬ãŒãããŸãã ããã©ã«ãã®å®è£
ã§ã¯ãç»é²è§£é€ã«ãã£ãŠç»é²æžã¿ããŒãã£ã®æ°ã0ã«ãªã£ãå Žåã«trueãè¿ããŸãã äžã«ç€ºãããŠããããã«ããã§ãŒã¶ãåºå®ã®å埩æ°ã䜿çšããŠã¢ã¯ã·ã§ã³ãå¶åŸ¡ããŠãããšãã¯ãå€ãã®å ŽåãçŸåšã®ãã§ãŒãºçªå·ããããå€ã«éãããšãã«çµäºããããã«ãã®ã¡ãœããããªãŒããŒã©ã€ããããšäŸ¿å©ã§ãã ãŸããforceTermination()ã¡ãœããã䜿çšãããšãåŸ
æ©äžã®ã¹ã¬ããã匷å¶çã«è§£æŸããŠçµäºå¯èœã«ããããšãã§ããŸãã
éå±€åã ãã§ãŒã¶ã¯ãç«¶åãæžããããã«ãéå±€åã«ãã(ã€ãŸããããªãŒæ§é ã§æ§ç¯ãã)ããšãã§ããŸãã 倿°ã®ããŒãã£ãå«ãŸããããã«ãéåžžã§ããã°å€§ããªåæç«¶åã³ã¹ããçºçãããã§ãŒã¶ãã代ããã«ããµããã§ãŒã¶ã®ã°ã«ãŒããå ±éã®èŠªãå ±æããããã«èšå®ã§ããŸãã ããã«ãããæäœããšã®ãªãŒããŒããããå¢ãããšããŠããã¹ã«ãŒããããå€§å¹ ã«åäžããå¯èœæ§ããããŸãã
éå±€åãã§ãŒã¶ã®ããªãŒã§ã¯ãåãã§ãŒã¶ã®ãã®èŠªãžã®ç»é²ãšç»é²è§£é€ã¯èªåçã«ç®¡çãããŸãã åãã§ãŒã¶ã®ç»é²æžã¿ããŒãã£ã®æ°ã(Phaser(Phaser,int)ã³ã³ã¹ãã©ã¯ã¿ãregister()ããŸãã¯bulkRegister(int)ã§ç¢ºç«ããã) 0以å€ã«ãªã£ãå Žåã¯åžžã«ãåãã§ãŒã¶ããã®èŠªã«ç»é²ãããŸãã arriveAndDeregister()ã®åŒåºãã®çµæãšããŠç»é²æžã¿ããŒãã£ã®æ°ã0ã«ãªã£ãå Žåã¯åžžã«ãåãã§ãŒã¶ããã®èŠªããç»é²è§£é€ãããŸãã
ç£èŠã åæã¡ãœãããåŒã³åºãããšãã§ããã®ã¯ç»é²æžã¿ããŒãã£ã ãã§ããããã§ãŒã¶ã®çŸåšã®ç¶æ
ã¯ã©ã®åŒåºãåŽã§ãç£èŠã§ããŸãã ã©ã®æç¹ã§ããåèšã§getRegisteredParties()ããŒãã£ãååšãããã®ãã¡ã®getArrivedParties()ãçŸåšã®ãã§ãŒãº(getPhase())ã«å°çããŠããŸãã æ®ãã®(getUnarrivedParties())ããŒãã£ãå°çãããšããã§ãŒãºãé²ããããŸãã ãããã®ã¡ãœããã«ãã£ãŠè¿ãããå€ã¯äžæçãªç¶æ
ãåæ ããŠããå¯èœæ§ããããããäžè¬ã«ãåæã®å¶åŸ¡ã«ã¯åœ¹ç«ã¡ãŸããã toString()ã¡ãœããã¯ããããã®ç¶æ
ã¯ãšãªãŒã®ã¹ãããã·ã§ãããéå
¬åŒã®ç£èŠã«äŸ¿å©ãªåœ¢åŒã§è¿ããŸãã
䜿çšäŸ:
Phaserã¯ãå¯å€æ°ã®ããŒãã£ãåŠçããåçºçãªã¢ã¯ã·ã§ã³ãå¶åŸ¡ããããã«ãCountDownLatchã®ä»£ããã«äœ¿çšã§ããŸãã ãã®ã¡ãœããã®æšæºçãªæ¹æ³ã¯ã次ã«ç€ºãããã«ãæåã«ç»é²ããæ¬¡ã«ã¢ã¯ã·ã§ã³ãéå§ãããã®ããšç»é²ãè§£é€ããããã«èšå®ããŸãã
void runTasks(List<Runnable> tasks) {
final Phaser phaser = new Phaser(1); // "1" to register self
// create and start threads
for (final Runnable task : tasks) {
phaser.register();
new Thread() {
public void run() {
phaser.arriveAndAwaitAdvance(); // await all creation
task.run();
}
}.start();
}
// allow threads to start and deregister self
phaser.arriveAndDeregister();
}
äžé£ã®ã¹ã¬ããã§ãæå®ãããå埩æ°ã ãã¢ã¯ã·ã§ã³ãç¹°è¿ãå®è¡ãããããã®1ã€ã®æ¹æ³ãšããŠãonAdvanceããªãŒããŒã©ã€ãããŸãã
void startTasks(List<Runnable> tasks, final int iterations) {
final Phaser phaser = new Phaser() {
protected boolean onAdvance(int phase, int registeredParties) {
return phase >= iterations || registeredParties == 0;
}
};
phaser.register();
for (final Runnable task : tasks) {
phaser.register();
new Thread() {
public void run() {
do {
task.run();
phaser.arriveAndAwaitAdvance();
} while (!phaser.isTerminated());
}
}.start();
}
phaser.arriveAndDeregister(); // deregister self, don't wait
}
ã¡ã€ã³ã»ã¿ã¹ã¯ãããšã§çµäºãåŸ
æ©ããå¿
èŠãããå Žåã¯ãåç»é²ããŠãããåæ§ã®ã«ãŒããå®è¡ã§ããŸãã
// ...
phaser.register();
while (!phaser.isTerminated())
phaser.arriveAndAwaitAdvance();
é¢é£ããæ§ç¯ã䜿çšãããšããã®ãã§ãŒãºã決ããŠInteger.MAX_VALUEãã©ããããªãããšã確å®ãªã³ã³ããã¹ãã§ãç¹å®ã®ãã§ãŒãºçªå·ãåŸ
æ©ã§ããŸãã ããšãã°ã
void awaitPhase(Phaser phaser, int phase) {
int p = phaser.register(); // assumes caller not already registered
while (p < phase) {
if (phaser.isTerminated())
// ... deal with unexpected termination
else
p = phaser.arriveAndAwaitAdvance();
}
phaser.arriveAndDeregister();
}
ãã§ãŒã¶ã®ããªãŒã䜿çšããŠnã¿ã¹ã¯ã®ã»ãããäœæããã«ã¯ãæ§ç¯æã«ç»é²ããPhaserãåãå
¥ããã³ã³ã¹ãã©ã¯ã¿ãåããTaskã¯ã©ã¹ãæ³å®ãããšã次ã®åœ¢åŒã®ã³ãŒãã䜿çšã§ããŸãã build(new Task[n], 0, n, new Phaser())ã®åŒåºãã®ããšãããšãã°ããŒã«ã«éä¿¡ããããšã«ãã£ãŠããããã®ã¿ã¹ã¯ãèµ·åã§ããŸãã
void build(Task[] tasks, int lo, int hi, Phaser ph) {
if (hi - lo > TASKS_PER_PHASER) {
for (int i = lo; i < hi; i += TASKS_PER_PHASER) {
int j = Math.min(i + TASKS_PER_PHASER, hi);
build(tasks, i, j, new Phaser(ph));
}
} else {
for (int i = lo; i < hi; ++i)
tasks[i] = new Task(ph);
// assumes new Task(ph) performs ph.register()
}
}
TASKS_PER_PHASERã®æé©ãªå€ã¯äž»ã«ãæ³å®ãããåæã®é »åºŠã«ãã£ãŠç°ãªããŸãã ãã§ãŒãºããšã®ã¿ã¹ã¯æ¬äœã極端ã«å°ãã(ãã®ãããé »åºŠãé«ã)å Žåã¯4çšåºŠã®å°ããå€ãããŸã極端ã«å€§ããå Žåã¯æå€§æ°çŸã®å€ãé©ããŠããå¯èœæ§ããããŸãã
å®è£
äžã®ããŒã: ãã®å®è£
ã§ã¯ãããŒãã£ã®æå€§æ°ã65535ã«å¶éããŸãã 远å ã®ããŒãã£ãç»é²ããããšãããšãIllegalStateExceptionãçºçããŸãã ãã ããä»»æã®å€§ããªåå è
ã®ã»ãããæ ŒçŽããããã«éå±€åãã§ãŒã¶ãäœæã§ããããããã®æ¹æ³ãåãããã«ããŠãã ããã
| ã³ã³ã¹ãã©ã¯ã¿ | 説æ |
|---|---|
Phaser() |
æåã«ç»é²ãããããŒãã£ãå«ãŸãã芪ãæããªããåæãã§ãŒãºçªå·0ã®æ°èŠãã§ãŒã¶ãäœæããŸãã
|
Phaser(int parties) |
æå®ãããæ°ã®ç»é²æžã¿æªå°çããŒãã£ãå«ã¿ã芪ãæãããåæãã§ãŒãºçªå·0ã®æ°èŠãã§ãŒã¶ãäœæããŸãã
|
Phaser(Phaser parent) |
Phaser(parent, 0)ãšåçã§ãã |
Phaser(Phaser parent, int parties) |
æå®ããã芪ãæã¡ãæå®ãããæ°ã®ç»é²æžã¿æªå°çããŒãã£ãå«ãæ°èŠãã§ãŒã¶ãäœæããŸãã
|
| 修食åãšå | ã¡ãœãã | 説æ |
|---|---|---|
int |
arrive() |
ä»ã®å°çãåŸ
æ©ããã«ãã®ãã§ãŒã¶ã«å°çããŸãã
|
int |
arriveAndAwaitAdvance() |
ãã®ãã§ãŒã¶ã«å°çããä»ãåŸ
æ©ããŸãã
|
int |
arriveAndDeregister() |
ãã®ãã§ãŒã¶ã«å°çããä»ã®å°çãåŸ
æ©ããã«ç»é²è§£é€ããŸãã
|
int |
awaitAdvance(int phase) |
ãã®ãã§ãŒã¶ã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ããé²ããŸã§åŸ
æ©ããçŸåšã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ãšçãããªããããã®ãã§ãŒã¶ãçµäºããå Žåã¯ããã«åŸ©åž°ããŸãã
|
int |
awaitAdvanceInterruptibly(int phase) |
ãã®ãã§ãŒã¶ã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ããé²ããŸã§åŸ
æ©ããåŸ
æ©äžã«å²èŸŒã¿ãçºçããå Žåã¯
InterruptedExceptionãã¹ããŒããçŸåšã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ãšçãããªããããã®ãã§ãŒã¶ãçµäºããå Žåã¯ããã«åŸ©åž°ããŸãã |
int |
awaitAdvanceInterruptibly(int phase, long timeout, TimeUnit unit) |
ãã®ãã§ãŒã¶ã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ããé²ãããæå®ãããã¿ã€ã ã»ã¢ãŠãæéãçµéãããŸã§åŸ
æ©ããåŸ
æ©äžã«å²èŸŒã¿ãçºçããå Žåã¯
InterruptedExceptionãã¹ããŒããçŸåšã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ãšçãããªããããã®ãã§ãŒã¶ãçµäºããå Žåã¯ããã«åŸ©åž°ããŸãã |
int |
bulkRegister(int parties) |
æå®ãããæ°ã®æ°ããæªå°çããŒãã£ããã®ãã§ãŒã¶ã«è¿œå ããŸãã
|
void |
forceTermination() |
ãã®ãã§ãŒã¶ã匷å¶çã«çµäºç¶æ
ã«ããŸãã
|
int |
getArrivedParties() |
ãã®ãã§ãŒã¶ã®çŸåšã®ãã§ãŒãºã«å°çããç»é²æžã¿ããŒãã£ã®æ°ãè¿ããŸãã
|
Phaser |
getParent() |
ãã®ãã§ãŒã¶ã®èŠªãè¿ããŸããååšããªãå Žåã¯
nullã§ãã |
int |
getPhase() |
çŸåšã®ãã§ãŒãºçªå·ãè¿ããŸãã
|
int |
getRegisteredParties() |
ãã®ãã§ãŒã¶ã«ç»é²ãããããŒãã£ã®æ°ãè¿ããŸãã
|
Phaser |
getRoot() |
ãã®ãã§ãŒã¶ã®äžäœããŒããšãªãã«ãŒããè¿ããŸãããã§ãŒã¶ã芪ãæããªãå Žåã¯ãã®ãã§ãŒã¶ãšåãã§ãã
|
int |
getUnarrivedParties() |
ãã®ãã§ãŒã¶ã®çŸåšã®ãã§ãŒãºã«ãŸã å°çããŠããªãç»é²æžã¿ããŒãã£ã®æ°ãè¿ããŸãã
|
boolean |
isTerminated() |
ãã®ãã§ãŒã¶ãçµäºããå Žåã¯
trueãè¿ããŸãã |
protected boolean |
onAdvance(int phase, int registeredParties) |
ãã§ãŒãºãé²ããçŽåã«ã¢ã¯ã·ã§ã³ãå®è¡ããçµäºãå¶åŸ¡ãããªãŒããŒã©ã€ãå¯èœãªã¡ãœããã§ãã
|
int |
register() |
æªå°çã®æ°èŠããŒãã£ããã®ãã§ãŒã¶ã«è¿œå ããŸãã
|
String |
toString() |
ãã®ãã§ãŒã¶ããã³ãã®ç¶æ
ãèå¥ããæååãè¿ããŸãã
|
public Phaser()
public Phaser(int parties)
parties - 次ã®ãã§ãŒãºã«é²ãããã«å¿
èŠãªããŒãã£ã®æ°IllegalArgumentException - ããŒãã£ã0æªæºãããµããŒããããããŒãã£ã®æå€§æ°ãã倧ããå Žåpublic Phaser(Phaser parent)
Phaser(parent, 0)ãšåçã§ããparent - 芪ãã§ãŒã¶public Phaser(Phaser parent, int parties)
parent - 芪ãã§ãŒã¶parties - 次ã®ãã§ãŒãºã«é²ãããã«å¿
èŠãªããŒãã£ã®æ°IllegalArgumentException - ããŒãã£ã0æªæºãããµããŒããããããŒãã£ã®æå€§æ°ãã倧ããå Žåpublic int register()
onAdvance(int, int)ã®åŒåºããé²è¡äžã®å Žåããã®ã¡ãœããã¯ã埩垰ããåã«å®è¡ãåŸ
æ©ããããšããããŸãã ãã®ãã§ãŒã¶ã芪ãæã¡ããã€ä»¥åã«ãã®ãã§ãŒã¶ã«ç»é²æžã¿ããŒãã£ããªãã£ãå Žåã¯ããã®åãã§ãŒã¶ããã®èŠªã«ç»é²ãããŸãã ãã®ãã§ãŒã¶ãçµäºããå Žåãç»é²ããããšããŠã广ã¯ãªããè² ã®å€ãè¿ãããŸãã IllegalStateException - ãµããŒããããããŒãã£ã®æå€§æ°ãããå€ãç»é²ããããšããå Žåpublic int bulkRegister(int parties)
onAdvance(int, int)ã®åŒåºããé²è¡äžã®å Žåããã®ã¡ãœããã¯ã埩垰ããåã«å®è¡ãåŸ
æ©ããããšããããŸãã ãã®ãã§ãŒã¶ã芪ãæã¡ãæå®ãããããŒãã£ã®æ°ã0ãã倧ããããã€ä»¥åã«ãã®ãã§ãŒã¶ã«ç»é²æžã¿ããŒãã£ããªãã£ãå Žåã¯ããã®åãã§ãŒã¶ããã®èŠªã«ç»é²ãããŸãã ãã®ãã§ãŒã¶ãçµäºããå Žåãç»é²ããããšããŠã广ã¯ãªããè² ã®å€ãè¿ãããŸãã parties - 次ã®ãã§ãŒãºã«é²ãããã«å¿
èŠãªè¿œå ã®ããŒãã£ã®æ°IllegalStateException - ãµããŒããããããŒãã£ã®æå€§æ°ãããå€ãç»é²ããããšããå ŽåIllegalArgumentException - parties < 0ã®å Žåpublic int arrive()
æªç»é²ã®ããŒãã£ããã®ã¡ãœãããåŒã³åºããšãäœ¿çšæ¹æ³ã®ãšã©ãŒã«ãªããŸãã ãã ãããã®ãšã©ãŒãçºçãããšããŠãããã®çµæã¯ãã®ãã§ãŒã¶ã®äžéšã®åŸç¶åäœã«éå®ããIllegalStateExceptionãšãªããŸãã
IllegalStateException - çµäºããŠããããæªå°çããŒãã£ã®æ°ãè² ã®å Žåpublic int arriveAndDeregister()
æªç»é²ã®ããŒãã£ããã®ã¡ãœãããåŒã³åºããšãäœ¿çšæ¹æ³ã®ãšã©ãŒã«ãªããŸãã ãã ãããã®ãšã©ãŒãçºçãããšããŠãããã®çµæã¯ãã®ãã§ãŒã¶ã®äžéšã®åŸç¶åäœã«éå®ããIllegalStateExceptionãšãªããŸãã
IllegalStateException - çµäºããŠããããç»é²æžã¿ããŒãã£ãŸãã¯æªå°çããŒãã£ã®æ°ãè² ã«ãªãå Žåpublic int arriveAndAwaitAdvance()
awaitAdvance(arrive())ãšåçã§ãã å²ã蟌ã¿ãŸãã¯ã¿ã€ã ã»ã¢ãŠãã§åŸ
æ©ããå¿
èŠãããå Žåã¯ããã®ä»ã®ããããã®åœ¢åŒã®awaitAdvanceã¡ãœããã䜿çšããŠãé¡äŒŒã®æ§ç¯ã§ããã調æŽã§ããŸãã 代ããã«ãå°çæã«ç»é²è§£é€ããå¿
èŠãããå Žåã¯ãawaitAdvance(arriveAndDeregister())ã䜿çšããŸãã
æªç»é²ã®ããŒãã£ããã®ã¡ãœãããåŒã³åºããšãäœ¿çšæ¹æ³ã®ãšã©ãŒã«ãªããŸãã ãã ãããã®ãšã©ãŒãçºçãããšããŠãããã®çµæã¯ãã®ãã§ãŒã¶ã®äžéšã®åŸç¶åäœã«éå®ããIllegalStateExceptionãšãªããŸãã
IllegalStateException - çµäºããŠããããæªå°çããŒãã£ã®æ°ãè² ã®å Žåpublic int awaitAdvance(int phase)
phase - å°çãã§ãŒãºçªå·ãçµäºããŠããå Žåã¯è² ã®å€ããã®åŒæ°ã¯éåžžãarriveãŸãã¯arriveAndDeregisterã以ååŒã³åºãããšãã«è¿ãããå€ã§ããpublic int awaitAdvanceInterruptibly(int phase)
throws InterruptedException
InterruptedExceptionãã¹ããŒããçŸåšã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ãšçãããªããããã®ãã§ãŒã¶ãçµäºããå Žåã¯ããã«åŸ©åž°ããŸããphase - å°çãã§ãŒãºçªå·ãçµäºããŠããå Žåã¯è² ã®å€ããã®åŒæ°ã¯éåžžãarriveãŸãã¯arriveAndDeregisterã以ååŒã³åºãããšãã«è¿ãããå€ã§ããInterruptedException - åŸ
æ©äžã«ã¹ã¬ããã®å²èŸŒã¿ãçºçããå Žåpublic int awaitAdvanceInterruptibly(int phase,
long timeout,
TimeUnit unit)
throws InterruptedException,
TimeoutException
InterruptedExceptionãã¹ããŒããçŸåšã®ãã§ãŒãºãæå®ããããã§ãŒãºå€ãšçãããªããããã®ãã§ãŒã¶ãçµäºããå Žåã¯ããã«åŸ©åž°ããŸããphase - å°çãã§ãŒãºçªå·ãçµäºããŠããå Žåã¯è² ã®å€ããã®åŒæ°ã¯éåžžãarriveãŸãã¯arriveAndDeregisterã以ååŒã³åºãããšãã«è¿ãããå€ã§ããtimeout - åŠçãäžæ¢ãããŸã§ã®åŸ
æ©æéãåäœã¯unitunit - timeoutãã©ã¡ãŒã¿ã®è§£éæ¹æ³ã決å®ããTimeUnitInterruptedException - åŸ
æ©äžã«ã¹ã¬ããã®å²èŸŒã¿ãçºçããå ŽåTimeoutException - åŸ
æ©äžã«ã¿ã€ã ã»ã¢ãŠãããå Žåpublic void forceTermination()
public final int getPhase()
Integer.MAX_VALUEã§ãããã®åŸã0ããåéããŸãã çµäºæããã§ãŒãºçªå·ã¯è² ã§ãããã®å Žåã¯ãçµäºã®åã®çŸåšã®ãã§ãŒãºãgetPhase()+Integer.MIN_VALUEã§ååŸã§ããŸãã public int getRegisteredParties()
public int getArrivedParties()
public int getUnarrivedParties()
public Phaser getParent()
nullã§ããnullpublic Phaser getRoot()
public boolean isTerminated()
trueãè¿ããŸããtrueprotected boolean onAdvance(int phase,
int registeredParties)
trueãè¿ããå Žåããã®ãã§ãŒã¶ã¯é²ããããŠæçµçãªçµäºç¶æ
ã«èšå®ããã以éã®isTerminated()ã®åŒåºãã¯trueãè¿ããŸãã ãã®ã¡ãœããã®åŒåºãã«ãã£ãŠã¹ããŒããã(éãã§ãã¯)äŸå€ãŸãã¯ãšã©ãŒã¯ãã¹ãŠããã®ãã§ãŒã¶ãé²ããããšããŠããããŒãã£ã«äŒæãããŸãããã®å Žåããã§ãŒã¶ã¯é²ããããŸããã
ãã®ã¡ãœãããžã®åŒæ°ã¯ãçŸåšã®ç§»è¡ãè¡ã£ãŠãããã§ãŒã¶ã®ç¶æ
ãæäŸããŸãã onAdvanceå
ãããã®ãã§ãŒã¶ã«å¯ŸããŠå°çãç»é²ãããã³åŸ
æ©ã¡ãœãããåŒã³åºãããšãã®å¹æã¯æå®ãããŠããªããããããã«äŸåããŠã¯ãããŸããã
ãã®ãã§ãŒã¶ããã§ãŒã¶ã®éå±€åã»ããã®ã¡ã³ããŒã§ããå ŽåãonAdvanceã¯ããã§ãŒãºãé²ãããã³ã«ãã®ã«ãŒãã»ãã§ãŒã¶ã«å¯ŸããŠã®ã¿åŒã³åºãããŸãã
ãã£ãšãäžè¬çãªãŠãŒã¹ã»ã±ãŒã¹ããµããŒãããããã«ããã®ã¡ãœããã®ããã©ã«ãã®å®è£
ã¯ãããŒãã£ã®arriveAndDeregisterã®åŒåºãã®çµæãšããŠç»é²æžã¿ããŒãã£ã®æ°ã0ã«ãªã£ããšãã«trueãè¿ããŸãã åžžã«falseãè¿ãããã«ãã®ã¡ãœããããªãŒããŒã©ã€ãããããšã«ãã£ãŠããã®åäœãç¡å¹ã«ããããã«ããå°æ¥ã®ç»é²æã®ç¶ç¶ãæå¹ã«ããããšãã§ããŸãã
Phaser phaser = new Phaser() {
protected boolean onAdvance(int phase, int parties) { return false; }
}phase - ãã®ã¡ãœããã«å
¥ã£ããšãã®ããã®ãã§ãŒã¶ãé²ããããåã®çŸåšã®ãã§ãŒãºçªå·registeredParties - ç»é²æžã¿ããŒãã£ã®çŸåšã®æ°truepublic String toString()
"phase = "ã«ç¶ããŠãã§ãŒãºçªå·ã"parties = "ã«ç¶ããŠç»é²æžã¿ããŒãã£ã®æ°ãããã³"arrived = "ã«ç¶ããŠå°çæžã¿ããŒãã£ã®æ°ãå«ãŸããŸãã ãã°ãŸãã¯æ©èœãéä¿¡
詳现ãªAPIãªãã¡ã¬ã³ã¹ããã³éçºè
ããã¥ã¡ã³ãã«ã€ããŠã¯ãJava SEã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ãã®ããã¥ã¡ã³ãã«ã¯ãæŠå¿µçãªæŠèŠãçšèªã®å®çŸ©ãåé¿æ¹æ³ãæå¹ãªã³ãŒãäŸãªã©ã®ãéçºè
ã察象ã«ãããã詳现ãªèª¬æãå«ãŸããŠããŸãã
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyãåç
§ããŠãã ããã