并发编程模式
一、future模式
在網(wǎng)上購(gòu)物時(shí),提交訂單后,在收貨的這段時(shí)間里無(wú)需一直在家里等候,可以先干別的事情。類(lèi)推到程序設(shè)計(jì)中時(shí),當(dāng)提交請(qǐng)求時(shí),期望得到答復(fù)時(shí),如果這個(gè)答復(fù)可能很慢。傳統(tǒng)的是一直等待到這個(gè)答復(fù)收到時(shí)再去做別的事情,但如果利用Future設(shè)計(jì)模式就無(wú)需等待答復(fù)的到來(lái),在等待答復(fù)的過(guò)程中可以干其他事情。
future模式核心思想就是異步調(diào)用,去除了主函數(shù)的等待時(shí)間,并使得原本需要等待的時(shí)間段可以用于處理其他業(yè)務(wù)邏輯。
下面是時(shí)序圖,左邊是傳統(tǒng)的單線(xiàn)程執(zhí)行,右邊使用了future模式。
?
我們通過(guò)synchronized結(jié)合wait()和notify()、并發(fā)包下的鎖都可以實(shí)現(xiàn)future模式,不過(guò)JDK已經(jīng)為我們提供了future模式的實(shí)現(xiàn),位于java.util.concurrent并發(fā)包下。
具體使用方法可參考文章:https://www.2cto.com/kf/201411/351903.html
?
二、Master-Worker模式
Master-Worker?模式是常用的并行計(jì)算模式。它的核心思想是系統(tǒng)由兩類(lèi)進(jìn)程協(xié)作工作:Master?進(jìn)程和?Worker?進(jìn)程。Master 負(fù)責(zé)接收和分配任務(wù),Worker?負(fù)責(zé)處理子任務(wù)。當(dāng)各個(gè)?Worker?子進(jìn)程處理完成后,會(huì)將結(jié)果返回給?Master?, 由?Master?進(jìn)行歸納和總結(jié)。其好處是能將一個(gè)大任務(wù)分解成若干個(gè)小任務(wù),并行執(zhí)行,從而提高系統(tǒng)的吞吐量。
?
在Master端往往會(huì)有如下的內(nèi)容:
1、一個(gè)盛放任務(wù)的容器,一般使用隊(duì)列來(lái)保證先添加的任務(wù)先執(zhí)行,因?yàn)樵谙旅鎱⒖嘉恼碌睦又?#xff0c;任務(wù)在main方法中被直接一口氣全部提交過(guò)來(lái),所以worker不需要在沒(méi)有任務(wù)可以取的時(shí)候而阻塞等待新任務(wù),也就是不牽涉到阻塞,所以在這里推薦使用非阻塞的線(xiàn)程安全隊(duì)列ConcurrentLinkedQueue性能更好,參考文章中也是使用了這種隊(duì)列。
2、一個(gè)盛放worker的線(xiàn)程集合,worker就是用來(lái)執(zhí)行任務(wù)的,所以就是個(gè)子線(xiàn)程,所以可以使用HashMap<String, Thread>來(lái)盛放,key是每個(gè)worker線(xiàn)程的標(biāo)識(shí)。
3、一個(gè)盛放任務(wù)結(jié)果的集合,和盛放worker的線(xiàn)程集合不同,worker的線(xiàn)程集合就是在初始化Master時(shí)需要指定有多少個(gè)worker的,所以是一并初始化好的,沒(méi)有并發(fā)也就沒(méi)有線(xiàn)程安全問(wèn)題,而任務(wù)結(jié)果的集合會(huì)被多個(gè)worker訪(fǎng)問(wèn),需要線(xiàn)程安全的容器才行,推薦ConcurrentHashMap。
每個(gè)worker端往往會(huì)有如下的內(nèi)容:
1、Master里盛放任務(wù)的容器的引用,因?yàn)樾枰@取任務(wù)。
2、Master里盛放任務(wù)結(jié)果集合,因?yàn)樾枰烟幚硗甑娜蝿?wù)結(jié)果放進(jìn)去。
Master-Worker模式的實(shí)現(xiàn)可參考文章:http://blog.csdn.net/lv_fq/article/details/70853315
?
三、生產(chǎn)者-消費(fèi)者模式
生產(chǎn)者-消費(fèi)者模式是一個(gè)經(jīng)典的多線(xiàn)程設(shè)計(jì)模式。它為多線(xiàn)程間的協(xié)作提供了良好的解決方案。 在生產(chǎn)者-消費(fèi)者模式中,通常由兩類(lèi)線(xiàn)程,即若干個(gè)生產(chǎn)者線(xiàn)程和若干個(gè)消費(fèi)者線(xiàn)程。生產(chǎn)者線(xiàn)程負(fù)責(zé)提交用戶(hù)請(qǐng)求,消費(fèi)者線(xiàn)程則負(fù)責(zé)具體處理生產(chǎn)者提交的任務(wù)。生產(chǎn)者和消費(fèi)者之間則通過(guò)共享內(nèi)存緩沖區(qū)進(jìn)行通信。
?
生產(chǎn)者-消費(fèi)者模式可以通過(guò)線(xiàn)程間通信的方式實(shí)現(xiàn),例如通過(guò)synchronized結(jié)合wait()和notify()、并發(fā)包下的鎖都可以。但最好的方式是使用阻塞隊(duì)列來(lái)實(shí)現(xiàn),阻塞隊(duì)列又是線(xiàn)程安全的這樣不僅高效而且實(shí)現(xiàn)非常簡(jiǎn)單,將阻塞隊(duì)列作為存放數(shù)據(jù)的內(nèi)存緩沖區(qū),通過(guò)調(diào)用阻塞隊(duì)列的阻塞方法put()和take(),開(kāi)發(fā)者不需要寫(xiě)困惑的wait-nofity代碼去實(shí)現(xiàn)通信。
生產(chǎn)者-消費(fèi)者模式的實(shí)現(xiàn)可參考文章:http://blog.csdn.net/yujin753/article/details/45723175
總結(jié)
- 上一篇: 运行idea报错: Module was
- 下一篇: 嘉庆恒运电商:拼多多商品售后怎么做