关于线程执行顺序的问题
? R君今天曾問我:假設(shè)現(xiàn)在有三個線程T1、T2、T3。那么他希望T1、T2、T3這三個線程按照順序去執(zhí)行,該怎么去完成。我本能的反應(yīng)是這個好辦,使用thread.jon()方法完全可以實(shí)現(xiàn)。接著他又問,有沒有其它的實(shí)現(xiàn)方式,這時我在想,線程的優(yōu)先級呢,為這三個線程設(shè)置優(yōu)先級,但是我隨之否定了自己的這個想法,因?yàn)榫€程的優(yōu)先級只是理論上的優(yōu)先級,它可以讓線程優(yōu)先級高的可能概率稍微大的先執(zhí)行,但是具體執(zhí)行哪一個線程卻是由電腦控制的。眾所周知,計算機(jī)對于線程的執(zhí)行是搶占式策略,誰能搶到誰先執(zhí)行,因此這個方案并不能完全控制順序。
????先說我使用join()方法來實(shí)現(xiàn)的具體過程吧;關(guān)于join()方法,假設(shè)A線程去調(diào)用B線程的join()方法,那么只有等待B線程完全執(zhí)行完畢,A線程才可以執(zhí)行。具體原理是在A線程中調(diào)用B線程的Join()方法,相當(dāng)于A線程調(diào)用了B線程的wait()方法,那么只用當(dāng)B線程執(zhí)行完畢,A才會執(zhí)行,這個期間A線程進(jìn)入阻塞狀態(tài)。看如下的實(shí)現(xiàn):
這種方式是在啟動線程的時候去順序的控制。使得并行執(zhí)行的任務(wù)串行化的執(zhí)行。下面的一種實(shí)現(xiàn)方式還是使用的join()方法,但是不同的地方在于下述的方法是在線程的內(nèi)部進(jìn)行控制的,其本質(zhì)和第一種相同。
(這篇文章是我從自己的微信公眾號上粘貼過來的)
在這里我吐槽下微信公眾號這個編輯器真的很糟心。尤其是對于程序猿來說,沒有markdown編輯器,文章的排版太不友好。代碼我只能貼圖片,否則根本不忍直視。
? ? ? ?在上述的例子中驗(yàn)證的結(jié)果我沒有貼出,但是保證了順序執(zhí)行。下面的一種方法是我參照網(wǎng)上的博文的實(shí)現(xiàn),線程池的實(shí)現(xiàn)。定義一個創(chuàng)建單個線程的線程池,所有的任務(wù)會存儲在一個阻塞隊(duì)列中,隊(duì)列遵從FIFO原則,即先進(jìn)先出的原則。這樣也可以保證執(zhí)行順序。
創(chuàng)建一個newSingleThreadExecutor的線程池。雖然保證了實(shí)現(xiàn),但是任務(wù)的提交時有順序的,先提交的是t1,然后t2、t3這種方式。任務(wù)的執(zhí)行存在順序。
????????第一次使用公眾號記錄自己日常的一些技術(shù)問題,希望能和大家多多交流。最后我再提一個實(shí)現(xiàn)的想法,就是雖然三個線程,但是對比多線程的生產(chǎn)者和消費(fèi)者模型來看,只多了一個線程,不知道能不能使用這種模型實(shí)現(xiàn),這位如果有好的實(shí)現(xiàn)也可以分享下。Best Regards!
?
最后再推薦下自己的微信公眾號
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/gosaint/p/9557644.html
總結(jié)
以上是生活随笔為你收集整理的关于线程执行顺序的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS下MySQL的彻底卸载
- 下一篇: 【ASP.NET】 【防止连续多次点击提