Java執行緒中阻塞佇列
Java語言提供了java.util.concurrent包解決執行緒同步問題,concurrent包中的阻塞佇列BlockingQueue能夠很好地執行緒同步問題,
介面BlockingQueue提供如下幾個執行緒同步方法
儲存資料:
offer(obj):向佇列BlockingQueue儲存資料,如果BlockingQueue可以容納,返回true,否則返回false.方法立刻返回不阻塞執行緒。
offer(E o, long timeout, TimeUnit unit),設定儲存資料的等待時間,如果在指定的時間內,還不能向BlockingQueue儲存資料,則返回失敗。
put(obj):把obj加到BlockingQueue裡,如果BlockQueue沒有空間,阻斷呼叫執行緒,一直等到到BlockingQueue裡面有空間再恢復執行。
取得資料:
poll(time):從對列BlockingQueue首位取物件,如果佇列為空等待time引數規定的時間,取不到資料返回null;
poll(long timeout, TimeUnit unit):從對列BlockingQueue首位取物件,等待設定時間,如果取不到資料返回null;
take():從對列BlockingQueue首位取物件,如果佇列為空一直等到資料直到佇列中有資料;
drainTo():一次從BlockingQueue獲取所有可用的資料物件、可以提升獲取資料效率。
BlockingQueue實現類
ArrayBlockingQueue,LinkedBlockingQueue
ArrayBlockingQueue使用陣列存取資料,生產者執行緒和消費者執行緒共享同一物件,它們不可以同時在物件加同步鎖,這與LinkedBlockingQueue不同,LinkedBlockingQueue使用連結串列儲存,生產者執行緒和消費者執行緒可以同時擁有對立的鎖,同時操作LinkedBlockingQueue佇列;ArrayBlockingQueue佇列有長度,而LinkedBlockingQueue佇列的長度是Integer.MAX_VALUE,當生產者執行緒快於消費者執行緒時可能導致記憶體溢位;在佇列中新增,刪除和插入物件時ArrayBlockingQueue不產生臨時物件,LinkedBlockingQueue生成額外的Node物件,這與可能導致GC壓力。
程式碼