Java线程与并发编程实践----同步器(Phaser)
生活随笔
收集整理的這篇文章主要介紹了
Java线程与并发编程实践----同步器(Phaser)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? Phaser是一個(gè)更加彈性的同步屏障。和同步屏障一樣,一個(gè)phaser使得一組線程在
屏障上等待,在最后一個(gè)線程到達(dá)之后,這些線程才得以繼續(xù)執(zhí)行。phaser也提供了和barrier
action等價(jià)的操作。
????和同步屏障協(xié)同固定數(shù)目的線程不同,一個(gè)phaser能夠協(xié)調(diào)不定數(shù)目的線程,這些
線程可以在任何時(shí)候注冊(cè)。
示例代碼:
????下面的例子創(chuàng)建了3個(gè)線程,打印一些字母,但是線程創(chuàng)建好后并不立刻執(zhí)行,而是在主程序中
對(duì)其進(jìn)行控制,3秒鐘后所有進(jìn)程同時(shí)開始執(zhí)行
import?java.util.concurrent.Phaser;public?class?MyTest?{public?static?void?main(String[]?args)?{Phaser?phaser?=?new?Phaser(3)?{//?共有3個(gè)工作線程,因此在構(gòu)造函數(shù)中賦值為3@Overrideprotected?boolean?onAdvance(int?phase,?int?registeredParties)?{System.out.println("\n=========華麗的分割線=============");return?registeredParties?==?0;}};System.out.println("程序開始執(zhí)行");char?a?=?'a';for?(int?i?=?0;?i?<?3;?i++)?{?//?創(chuàng)建并啟動(dòng)3個(gè)線程new?MyThread((char)?(a?+?i),?phaser).start();}while?(!phaser.isTerminated())?{//?只要phaser不終結(jié),主線程就循環(huán)等待Thread.yield();}System.out.println("程序結(jié)束");} }class?MyThread?extends?Thread?{private?char?c;private?Phaser?phaser;public?MyThread(char?c,?Phaser?phaser)?{this.c?=?c;this.phaser?=?phaser;}@Overridepublic?void?run()?{while?(!phaser.isTerminated())?{for?(int?i?=?0;?i?<?10;?i++)?{?//?將當(dāng)前字母打印10次System.out.print(c?+?"?");}//?打印完當(dāng)前字母后,將其更新為其后第三個(gè)字母,例如b更新為e,用于下一階段打印c?=?(char)?(c?+?3);if?(c?>?'z')?{//?如果超出了字母z,則在phaser中動(dòng)態(tài)減少一個(gè)線程,并退出循環(huán)結(jié)束本線程phaser.arriveAndDeregister();break;}?else?{//?反之,等待其他線程到達(dá)階段終點(diǎn),再一起進(jìn)入下一個(gè)階段phaser.arriveAndAwaitAdvance();}}} }轉(zhuǎn)載于:https://blog.51cto.com/12222886/2062974
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Java线程与并发编程实践----同步器(Phaser)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [机器学习] Coursera ML笔记
- 下一篇: 学习编程可以参考哪些网站?