java 同步器SynchronousQueue詳解及實例
同步器簡介
學習以來對線程的操作有很大的改觀,從c/c++的mutex到java的各種鎖(當然不是嫌麻煩,java讀寫鎖的實現(xiàn)還是帶來不少好處的,但是sokcet的設計我就不敢恭維了,tcp和udp是兩個類,弄得我現(xiàn)在對udp也不怎么熟悉)。其中最讓我感到特別剛需的設計就是同步器,除了countdownlatch,剩下的都比較剛需,cyclicbarrier我現(xiàn)在唯一能感覺他的好用處就是循環(huán)打印a,b,exchanger和SynchronousQueue我一直沒發(fā)現(xiàn)什么作用,兩個就適合生產者消費者問題。以上就是四大同步器,聽說過2個以上的就很厲害了,有些場合太難想了。
場景思路
這次說最后兩個用的場景吧,我要做的事情呢,是采集一堆數據,然后采集另外的數據綜合處理,但是兩個數據是和時間相關的,如果順序執(zhí)行的話,那么處理結果的可信度越低,最初的設想就是利用異步處理,兩個數據采集同時進行,然后一起處理,futuretask,就作為首選,我的采集信息還是周期性的任務,必需要用定時的線程池了,但是這種線程池(別說timer,這個類更建議用線程池替換)并沒有為異步處理做返回值,我也沒辦法直接獲取處理的數據了,無奈的情況下只能用線程來做了,同時也必須要用同步器來同步了,用手動阻塞線程然后喚醒這個行為實在是太不可取了,你全喚醒了,可能造成不該運行的代碼開始運行,喚醒單個,還得看cpu的調度,于是想到了exchanger和SynchronousQueue,我最終選取了SynchronousQueue。
SynchronousQueue
其實就是特殊的阻塞隊列,特殊就特殊在他最多放一個元素,而且這個元素不在特定的時間消費掉就沒了,而且永遠長度都是0,具體看api就發(fā)現(xiàn)能用的方法沒幾個,3個是放入,2個是取走。
demo
生產者,消息最多存放1分鐘
public void run() {
try {
queue.offer(i++,1,TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("add");
}
消費者
System.out.println(queue.poll(1,TimeUnit.SECONDS));
用了這個同步器,這種定時生產者消費者問題,代碼量就很少,不需要自己再寫同步的代碼了。也避免了最初喚醒阻塞帶來的不可預估性。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
SpringCloud Gateway自動裝配實現(xiàn)流程詳解
Spring Cloud Gateway旨在為微服務架構提供一種簡單有效的、統(tǒng)一的 API 路由管理方式。Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系中的網關,它不僅提供統(tǒng)一的路由方式,并且基于 Filter 鏈的方式提供了網關基本的功能,例如:安全、監(jiān)控/埋點和限流等2022-10-10
java實現(xiàn)附件預覽(openoffice+swftools+flexpaper)實例
本篇文章主要介紹了java實現(xiàn)附件預覽(openoffice+swftools+flexpaper)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-10-10
解決springboot+activemq啟動報注解錯誤的問題
這篇文章主要介紹了解決springboot+activemq啟動報注解錯誤的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

