什麼是阻塞佇列呢?
首先,它是乙個佇列,先進先出。其次,它是被阻塞了的。
當阻塞隊列為空時,我們從佇列從獲取元素的操作會被阻塞。
當阻塞佇列滿了時,我們往佇列新增元素的操作會被阻塞。
我們常用的阻塞佇列是blockqueue:通過blockqueue,我們不需要關心什麼時候需要阻塞執行緒,什麼時候需要喚醒執行緒,這一切blockqueue已經幫我們做完了。
blockqueue是乙個介面,有七個實現類:
我們最常用的有三個:
blockqueue的核心方法:
方法型別
丟擲異常
特殊值阻塞
超時插入
add(e)
offer(e)
put(e)
offer(e,time,unit)
移除remove()
poll()
take()
poll(time,unit)
檢查element()
peek()無無
丟擲異常:
執行add()方法,向已經滿了的阻塞佇列中新增元素時,會丟擲異常。
執行結果:public class blockqueuedemo
}
從已空的阻塞佇列中取出元素,也會報異常:
特殊值:public class blockqueuetest
}
正常true,異常false,取值異常為null
阻塞:如果新增不進去或取不出來,就會一直阻塞
超時:我們可以設定乙個超時時間,如果一直新增不進去或取不出來,超出時間就會返回特殊值
synchronousqueuesynchronousqueue每put乙個元素,都需要take之後才能繼續新增元素。
阻塞佇列之經典場景:生產者與消費者模式
執行結果:public class prodconsumer_blockqueuedemo catch (interruptedexception e)
},"product").start();
new thread(()-> catch (interruptedexception e)
},"consumer").start();
try catch (interruptedexception e)
system.out.println();
system.out.println();
system.out.println("5秒鐘時間到,main執行緒叫停,活動結束");
myresource.stop();
}
}
class myresource
public void myproduct() throws interruptedexception else
timeunit.seconds.sleep(1);
}
system.out.println(thread.currentthread().getname() + "\t叫停,表示flag = false,生產動作結束");
}
public void myconsumer() throws interruptedexception
system.out.println(thread.currentthread().getname() + "\t 消費佇列"+result+"成功");
}
}
public void stop()
}
併發工具包 阻塞佇列BlockingQueue
阻塞佇列,顧名思義 如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。blockingqueue是介面,目前已知的實現類如下 arrayblockingqueue 底層底層通過陣列來儲存佇列中的元素,所...
等待佇列 阻塞非阻塞
阻塞 裝置驅動不阻塞,使用者想獲取裝置資源只能不停的查詢,這無謂的消耗cpu資源。而阻塞訪問,不能獲取資源的程序將進入休眠,它將cpu資源 禮讓 給其他程序 喚醒程序的地方最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷 定義頭 wait queue head t queue 初始化...
阻塞佇列BlockingQueue
例介紹乙個特殊的佇列 blockingqueue,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到b...