欢迎来到天天文库
浏览记录
ID:37710408
大小:47.99 KB
页数:5页
时间:2019-05-29
《Java 7 理解 Phaser》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java7引入了一个全新灵活的线程同步机制,名为Phaser。如果你需要等待线程结束然后继续执行其他任务,那么Phaser是一个好的选择,接下来我们一步步来介绍Phaser的使用:首先看下面的代码:?12345678910111213141516171819202122232425262728293031323334importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjava.util.concurrent.Phaser; publicclassPhaserExample{ publi
2、cstaticvoidmain(String[]args)throwsInterruptedException{ Listtasks=newArrayList<>(); for(inti=0;i<2;i++){ Runnablerunnable=newRunnable(){ @Override publicvoidrun(){ inta=0,b=1; for(inti=0;i<2000000000;i++){ a=a+b; b=a-b; } } }; tasks.add(run
3、nable); } newPhaserExample().runTasks(tasks); } voidrunTasks(Listtasks)throwsInterruptedException{ 3536373839404142434445464748495051525354555657 finalPhaserphaser=newPhaser(1){ protectedbooleanonAdvance(intphase,intregisteredParties){ returnphase>=1
4、
5、registeredParties==0
6、; } }; for(finalRunnabletask:tasks){ phaser.register(); newThread(){ publicvoidrun(){ do{ phaser.arriveAndAwaitAdvance(); task.run(); }while(!phaser.isTerminated()); } }.start(); Thread.sleep(500); } phaser.arriveAndDeregister(); } }这个例子让我们可以深入了解Phaser的使
7、用,下面是对这个代码的分析:Line8-27: main 方法创建了两个Runnable任务Line29:任务列表当作参数传递给runTasks方法runTasks 方法实际使用了一个Phaser用于同步任务,使得每个任务在并行执行之前必须先到达屏障(Barrier)。列表中的任务执行了两次,执行情况如下图所示:注意:"party"是Phaser中的一个术语,相当于是线程的意思,当一个party到达,就是线程到达意思就是线程到了同步的屏障(Barrier)。Line35:createa Phaser thathasoneregisteredparty(thismeans:atthi
8、stimephaserexpectsonethread=partytoarrivebeforeitcanstarttheexecutioncycle) Line36:implementthe onAdvance-Methodtoexplainthatthistasklistisexecutedtwice(doneby:Line37saysthatitreturnstrueifphaseisequalorhigherthen1) Line41:iterateoverthelistoftasks Line42:registerthisthreadwiththe Phaser.Notic
9、ethata Phaser instancedoesnotknowthetaskinstances. It'sasimplecounterofregistered,unarrivedandarrivedparties,sharedacrossparticipatingthreads. Iftwopartiesareregisteredthentwopartiesmustarriveatthephasertobeabletostartthefirstcycle. Lin
此文档下载收益归作者所有