日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

要學習多線程一些基本的同步類也是不得不學習的,這里主要講一點基本的概念與使用。

阻塞隊列

阻塞隊列提供可阻塞的put和take方法,支持定時的offer和poll方法,如果隊列已經滿了,那么put方法將阻塞直到有空間可用;如果隊列為空,那么take方法將會阻塞直到有元素可用;同時隊列可以是有界也可以是無界的,無界隊列永遠都不會充滿,因此無界隊列的put方法永遠不會阻塞;

JAVA中的阻塞隊列主要有以實現BlockingQueue接口的幾個類,其中LinkedBlockingQueue、ArrayBlockingQueue對應LinkedList與ArrayList,他們是先進先出隊列(FIFO);阻塞隊列能夠實現生產者與消費者的關系,生產者往隊列中put數據,而消費者往take中拉取數據,進而實現異步操作。曾經的生產中的例子簡化后如下圖:

阻塞隊列實現生產者消費者以及同步工具類

 

隊列還有一些實現比如:

PriorityBlockingQueue隊列是優先級隊列,根據元素的比較來控制順序;

SynchronousQueue隊列維護的不是元素而是線程,這些線程在等待把元素加入或者移除隊列,就好像餐館出菜,前面的隊列都是把菜炒好了放到放菜的地方,服務員一個一個拿走,而SynchronousQueue則沒有放菜的地方,廚師炒好菜直接給服務員端走,所以SynchronousQueue要求消費者足夠多,并且總是有至少一個消費者在等待才適合用。

同步工具類

閉鎖

閉鎖:可以延遲線程的進度直到其到達終止狀態。閉鎖相當于一個閘門,在閉鎖到達結束狀態之前,這個閘門一直是關閉的,任何線程都不能通過當到達結束狀態時,閘門允許所有線程通過,閉鎖到達結束狀態后不會再改變狀態閉鎖。

閉鎖主要作用是可以用來確保一些活動直到其他活動都完成后才繼續執行。比如一個初始化需要等另一個初始化,比如所有玩家都準備才開始。

CountDownLatch是一種閉鎖實現,它初始化一個正數,countDown方法使數字遞減,await方法使線程等待計數器到0,否則阻塞,示例如下圖:

阻塞隊列實現生產者消費者以及同步工具類

 

這個方法主要用來統計一個任務在多個線程同步執行下消耗時間,利用兩個閉鎖實現了線程先一起準備好,然后放開開始閉鎖,所有線程一起執行,每個線程最后都會countDown一下結束閉鎖,當所有線程執行完成結束閉鎖也就方法,這樣就可以實現統計所有線程一起執行消耗的時間。

FutureTask

FutrueTask是一個實現了Runnable的類,并且它可以獲取到線程的執行結果,get方法執行取決于任務的狀態,如果任務已經完成,那么get會立即返回結果,否則get將

阻塞直到任務進入完成狀態,可以利用它的這個功能來實現閉鎖。

它還可以用來異步提前計算一些比較耗性能的值,比如一個操作比較耗性能那么可以讓它先執行,等到需要計算的結果的時候在get。

信號量

計數信號量(Counting Semaphore)用來控制同時訪問某個特定資源的操作數量,或者同時執行某個指定操作的數量。

實現原理是:Semaphore管理著一組虛擬的許可,執行操作前必須先acquire獲得許可,這個許可就減一,如果許可被減到0,線程再來獲取許可就阻塞等待其他線程在操作完成后release釋放許可;

比如初始化了一定數量的數據庫線程池,每個線程獲取線程池時先acquire,如果獲取成功說明有線程繼續執行,如果沒有線程了acquire方法會阻塞等待有多余線程。

還可以把計數信號量的數量設置為1,那么只要有一個線程acquire成功,其他線程就只能等待直到線程release,這樣就實現了一個互斥鎖。

柵欄

柵欄類似于閉鎖,他也是阻塞一組線程直到某個事件發生,區別在于柵欄是等待所有線程到達指定,而閉鎖是等待一個事件,閉鎖是一次性的不會重置。閉鎖是等待其他線程執行完成等待線程才開始執行,而柵欄是讓每個線程都等待,直到所有線程都是等待狀態,那么所有線程一起繼續執行。

可能有點不好理解,通過下面一個例子和閉鎖例子進行對比,示例如下圖:

阻塞隊列實現生產者消費者以及同步工具類

 

不管執行多少次,一定是所有的"開始"打印完成后才會打印"結束",并且如果線程的數量沒有初始化柵欄的值多,所有線程都會處于阻塞狀態。

總結

今天總結了一點阻塞隊列的知識和應用,平時一些消耗性能而創建線程去異步執行可能會造成線程太多的情況,可以簡單的通過阻塞隊列來實現生產者消費者的方式來解決問題。

還總結了一點同步工具類的知識,主要是理解這些基本概念和使用場景,閉鎖通過觸發countDown來減少計數器,當計數器減到0,await方法放行。信號量則是acquire方法去獲取release方法去釋放,柵欄則是先運行到await地方的線程先等待,等到所有線程都到了再一起執行,尤其要理解閉鎖和柵欄的區別。

閉鎖用來確保一些活動執行完成才執行一些操作,信號量用來保證某些操作的數量,柵欄用來等待所有操作一起到達指定點再一起繼續執行。

Java程序員日常學習筆記,如理解有誤歡迎各位交流討論!

分享到:
標簽:隊列 阻塞
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定