JAVA-集合、IO流裁良、多線程

【020 標(biāo)記接口】

標(biāo)記接口沒有任何成員和方法凿将,表明的是能夠具備某種功能,通常是在編譯器進(jìn)行類型校驗(yàn)价脾。

① Cloneable接口牧抵,代表類可以被拷貝,否則調(diào)用對象的clone方法會拋出異常侨把;另外clone方法是Object類的方法犀变,底層實(shí)現(xiàn)通過本地方法,效率更高座硕,因此重寫clone方法最好先調(diào)用super.clone方法弛作;

② Serializable接口,代表類可以被序列化华匾,否則使用ObjectInputStream的readObject和ObjectOutputStream的writeObject方法會拋出異常映琳;

③ RandomAccess接口机隙,代表類對象是否支持快速訪問,例如ArrayList和LinkedList萨西,前者是連續(xù)存儲數(shù)據(jù)的有鹿,可以聲明為RandomAccess接口,則編譯器對于foreach的處理谎脯,前者會使用for+下標(biāo)遍歷葱跋,而后者只能使用迭代器。

【021 序列化與反序列化】

① 序列化的對象建議自定義SerializableID成員的值源梭,否則編譯器會自動分配娱俺,其作用是用來比較序列化前的類和序列化后的類是否是同一個版本;

② 序列化的過程废麻,可以調(diào)用ObjectOutputStream的writeObject方法荠卷,static和transient類型的數(shù)據(jù)不會被寫入;寫入時烛愧,首先會寫入類類型油宜,然后寫入父類類型,接著依次寫入各個成員類型和賦值怜姿;

③ 反序列化的類型慎冤,可以調(diào)用ObjectIutputStream的readObject方法,首先利用反射的方法沧卢,根據(jù)類型名稱生成對象蚁堤,對于成員對象,也會根據(jù)成員類型但狭,生成成員對象违寿;

④ 父類類型不支持可序列化,則必須提供無參構(gòu)造函數(shù)熟空,成員必須支持可序列化藤巢。

【022 Java異常處理機(jī)制】

Java異常可以分為Error和Exception息罗。Error是虛擬機(jī)錯誤掂咒,如OutOfMemoryError;Exception可以分為其他異常和RunTimeException迈喉,RunTimeException可以通過虛擬機(jī)JVM捕獲處理绍刮,如空指針異常、數(shù)組越界異常等挨摸,而其他異常必須主動捕獲孩革,否則編譯不過,如IOException得运。

【023 Java動態(tài)代理】

動態(tài)代理可以分為Java代理和CGLib代理膝蜈,Java代理是以接口為基礎(chǔ)的锅移,被代理的類需要繼承某個接口,然后InvocationHandler的invoke方法實(shí)際上是對接口方法的封裝饱搏;而CGLib代理是以抽象類為基礎(chǔ)的.

【024 Java注解】

Java注解可以理解為一種特殊的接口類型@Interface非剃,是描述類/方法/成員的一種元數(shù)據(jù)。注解可以擁有成員并為其指定默認(rèn)值推沸,通過注解形式標(biāo)注的類/方法/成員备绽,可以通過反射,獲取注解的成員并做出適當(dāng)?shù)牟僮鳌?/p>


【025 String原理】

String的內(nèi)部核心成員是private final char[]鬓催,編碼格式是UNICODE肺素,意味著String的內(nèi)容不可修改,但是String的引用可以替換的宇驾。另外String是final類型的压怠,說明String不可以被繼承。此外飞苇,StringBuilder和StringBuffer也是final類型的,但是StringBuilder是非線程安全的蜗顽,而StringBuffer通過Synchronized實(shí)現(xiàn)了線程安全布卡。

【026 String的基本操作】

① String是唯一實(shí)現(xiàn)了運(yùn)算符+重載的類,其底層實(shí)現(xiàn)是通過StringBuilder的appender方法完成的雇盖,最后再通過toString轉(zhuǎn)回字符串忿等;

② 常量類型或者final類型的字符串進(jìn)行+運(yùn)算,編譯器會進(jìn)行優(yōu)化崔挖,直接記錄最終結(jié)果贸街。


【027 集合的分類】

集合可以分為Collection和Map,Collection又可以分為List和Set狸相。List是有序可重復(fù)的薛匪,通過繼承AbstractCollection和AbstractList抽象類,實(shí)現(xiàn)了三個分支:ArrayList脓鹃、Vector和LinkedList逸尖,其中Vector是棧Stack的父類,而LinkedList是隊(duì)列Queue的實(shí)現(xiàn)類瘸右。Set的實(shí)現(xiàn)是基于Map的Key值娇跟,因此是無順序不可重復(fù)的,通過繼承AbstractCollection和AbstractSet實(shí)現(xiàn)了TreeSet太颤、HashSet和LinkedHashSet苞俘。

【028 Iterator接口】

Iterator是集合的內(nèi)部實(shí)現(xiàn)類,幫助遍歷集合容器龄章。其提供了一種Fast-Fail的線程遍歷安全機(jī)制吃谣,使用modeCount記錄當(dāng)前的版本號乞封,如果在遍歷過程中對集合進(jìn)行過增刪改操作,會導(dǎo)致版本號變化基协,和遍歷的版本號不相同歌亲,從而拋出異常。Iterator內(nèi)部還有兩個成員cursor游標(biāo)和lastRet澜驮,分別指向下一個要訪問的位置和最后訪問的位置陷揪,通過這兩個成員實(shí)現(xiàn)方法hasNext、next和remove等杂穷。

【029 ArrayList的內(nèi)部結(jié)構(gòu)】

ArrayList是非線程安全的悍缠,允許空值,其內(nèi)部核心是private transient Object[] elementData成員耐量,默認(rèn)大小為10飞蚓,每次擴(kuò)容為1.5倍的原有size+1。transient的作用是對象在序列化的過程廊蜒,不會直接把elementData直接序列化趴拧,而是提供了readObject和writeObject方法,序列化的是elementData已使用的空間大小和保存的數(shù)據(jù)山叮,避免序列化無意義的元素著榴。同時ArrayList聲明了Cloneable接口,并重寫clone方法實(shí)現(xiàn)深拷貝屁倔。

【030 Vector的內(nèi)部結(jié)構(gòu)】

Vector與ArrayList最大的區(qū)別是通過Synchronized實(shí)現(xiàn)了線程安全脑又,其內(nèi)部核心是不帶有屬性transient的elementData成員,可以直接序列化锐借,默認(rèn)大小為10问麸,每次擴(kuò)容為2倍。

【031 LinkedList的內(nèi)部結(jié)構(gòu)】

LinkedList本質(zhì)上是一個非線程安全的帶頭指針的雙向鏈表钞翔,核心成員是transient? Entry<E> header严卖。Transient同樣表明其不可直接序列化,而是直接保存Entry中的數(shù)據(jù)內(nèi)容布轿,節(jié)省序列化空間妄田。雙向鏈表在查找指定位置的元素時,可以根據(jù)index與size的關(guān)系驮捍,決定是從頭開始查找還是從尾倒序查找疟呐。

【032 HashMap的內(nèi)部結(jié)構(gòu)】

HashMap是非線程安全的,無序不可重復(fù)东且,Key和Value都允許是Null启具。核心成員transient Entry[] table,初始化大小為2的指數(shù)珊泳,數(shù)組的每個元素都是一個單向鏈表的首元素鲁冯,沒有頭指針拷沸。Transient序列化是直接保存key和value的值。元素存儲時首先根據(jù)key值計(jì)算hashcode薯演,對hsahcode二次hash后(盡量避免沖突)撞芍,找到table中對應(yīng)的元素,然后在對應(yīng)的鏈表中依次通過equals比較key是否相同跨扮,key為NULL默認(rèn)保存在table[0]中序无。HashMap的遍歷只能通過迭代器,依次對數(shù)組中的每個鏈表元素進(jìn)行訪問衡创,數(shù)組擴(kuò)容和插入時帝嗡,都是從鏈表元素單向訪問,因此是無序的璃氢。

【033 LinkedHashMap的內(nèi)部結(jié)構(gòu)】

LinkedHashMap是在HashMap的基礎(chǔ)上哟玷,提供了一種快速訪問機(jī)制,也就是在HashMap原有的數(shù)據(jù)結(jié)構(gòu)上一也,添加一個帶頭指針的雙向鏈表巢寡,每次插入元素到數(shù)值的同時,也會插入一份到這個雙向鏈表椰苟,在對元素進(jìn)行遍歷時直接使用抑月。可以指定元素在雙向鏈表的遍歷順序尊剔,默認(rèn)按照插入順序,也可以按照訪問順序菱皆,在每次訪問元素后须误,把元素移動到鏈表最前端。

【034 HashTable的內(nèi)部結(jié)構(gòu)】

HashTable與HashMap最大的區(qū)別是通過Synchronized實(shí)現(xiàn)了線程安全仇轻,由于支持多線程并發(fā)京痢,因此Key和Value都不允許是Null。假設(shè)允許篷店,通過get方法返回NULL的兩種可能性:元素不存在或者value為Null無法判斷祭椰,而單線程通過consistKey可以判斷。

【035 ConcurrentHashMap的內(nèi)部結(jié)構(gòu)】

ConcurrentHashMap在HashMap的基礎(chǔ)上疲陕,增加了Segments數(shù)組方淤,每個元素都是可重入互斥鎖ReentrantLock的子類,擁有HashEntry數(shù)組的成員蹄殃,與HashMap的核心成員一致携茂。可以理解為诅岩,Segments的每一個元素都是一個加鎖HashMap讳苦,不同的HashMap之間支持并發(fā)訪問带膜。不過Segment的HashMap中鏈表的next是final的,這會導(dǎo)致的刪除元素時鸳谜,該元素鏈表中排在元素之前的元素會被從頭復(fù)制一份并調(diào)用插入函數(shù)倒序插入鏈表膝藕。

【036 TreeMap的內(nèi)部結(jié)構(gòu)】

TreeMap的底層是紅黑樹,是在二叉搜索樹的基礎(chǔ)上咐扭,對有序數(shù)列的優(yōu)化芭挽。通常使用的鏈表或者數(shù)組,要么插入耗時草描,要么增刪耗時览绿,而平衡二叉樹可以均衡這一現(xiàn)象。


【037 IO流分類】

IO流可以分為字節(jié)流/字符流穗慕,以讀取的內(nèi)容是原始字節(jié)還是封裝后的編碼字符來區(qū)分饿敲;或者節(jié)點(diǎn)流和處理流,節(jié)點(diǎn)流直接從指定位置獲取內(nèi)容逛绵,而處理流作為封裝怀各,對字節(jié)流添加輔助功能。

【038 FileInputStream和FileOutputStream的工作原理】

字節(jié)流术浪,節(jié)點(diǎn)流瓢对。FileInputStream的方法read,通過參數(shù)設(shè)置讀取一個字節(jié)或者讀取一個字節(jié)數(shù)組胰苏,但核心都是調(diào)用native方法的read0硕蛹,一個一個讀取字節(jié),效率較低硕并。FileOutputStream的方法write尾组,每次輸出一個字節(jié)碉纺,核心也是調(diào)用native的write0,可以通過append屬性指定是追加到文件末尾還是重頭寫入。多個流可以同時訪問一個文件忱嘹,各自維護(hù)一套對文件的索引搏明。此外省艳,文件流支持NIO操作瓜挽,通過getChannel來獲取通道,但還是會阻塞在read和write方法上么库。

【039 BufferedInputStream和BufferedOutputStream的工作原理】

字節(jié)流傻丝,處理流∷呷澹可以封裝在FileInputStream和FileOutputStream上桑滩,通過提供一個volatile的字節(jié)數(shù)組來支持緩存,默認(rèn)大小是8M。與FileInputStream和FileOutputStream的read和write帶字節(jié)參數(shù)方法相比运准,好處是主動維護(hù)了一個可控制的字節(jié)數(shù)組幌氮,通過pos和count來記錄數(shù)組的讀寫,寫時一定要通過flush主動輸出胁澳,否則會等到緩沖區(qū)滿時再一次性輸出该互。其read和write方法是synchronized的,保證一次輸入輸出的字節(jié)流是安全的韭畸。

【040 DataInputStream和DataOutputStream的工作原理】

字節(jié)流宇智,處理流。提供了一次讀寫多個字節(jié)并按編碼轉(zhuǎn)為int胰丁、char等各種類型的方法随橘,例如readUTF,但是在調(diào)用過時方法readLine時锦庸,由于不需要指定編碼机蔗,會把2個byte直接轉(zhuǎn)化為char,然后把char數(shù)組轉(zhuǎn)化為String甘萧,出現(xiàn)亂碼萝嘁;同時對于System.In輸入流,還會因?yàn)闆]有讀到\r\n阻塞扬卷。

【041 ObjectInputStream和ObjectOutputStream的工作原理】

字節(jié)流牙言,處理流。主要是實(shí)現(xiàn)對象序列化使用怪得,readObject和writeObject咱枉。

【042 FileReader和FileWriter的工作原理】

字符流,節(jié)點(diǎn)流徒恋。底層實(shí)現(xiàn)主要是靠父類InputStreamReader和OutputStreamWriter來完成蚕断,通過StreamEncoder和StreamDecoder對FileInputStream和FileOutputStream讀取的字節(jié)進(jìn)行編解碼。

【043 RandomAccessFile的工作原理】

RandomAccessFile支持雙向讀寫因谎,同時實(shí)現(xiàn)接口DataInput和DataOutput接口基括,底層的read和write都是通過native方法實(shí)現(xiàn)颜懊,按照byte讀寫财岔,可以通過seek(pos)支持快速訪問。

【044 NIO的工作原理】

NIO由Buffer河爹、Channel和Selector三部分組成匠璧。Channel是一個雙向通道,從Buffer中讀取或?qū)懭霐?shù)據(jù)咸这。Buffer是一塊連續(xù)的內(nèi)存空間夷恍,子類可以指定數(shù)據(jù)類型,通過capacity媳维、position和limit三個變量控制酿雪。Capacity指Buffer可以讀寫多少個類型數(shù)據(jù)遏暴,position表示下一個讀或?qū)懙奈恢茫瑥膶懩J角袚Q到讀模式時指黎,會置為0朋凉;limit讀模式指向能讀取多少個數(shù)據(jù),寫模式等于capacity醋安。Selector是NIO的核心杂彭,通過把channel注冊到Selector上,通過select方法輪詢訪問各個channel吓揪,直到channel上有響應(yīng)事件亲怠。

【045 BIO、NIO和AIO的區(qū)別】

BIO是同步阻塞的柠辞,NIO是同步非阻塞的团秽,而AIO是異步非阻塞的。以Tomcat為例钾腺,BIO會使用ServerSocket的accept方法徙垫,一直阻塞到請求到來后,分配給線程池的Processor放棒,然后重新accept阻塞姻报;NIO使用ServerSocketChannel,并注冊到selector上间螟,通過selector的select輪詢獲取請求吴旋;AIO采用主動通知的方式,獲取到的請求會主動推送給Proceesor厢破。


【046 Java的線程狀態(tài)】

線程狀態(tài)可以分為就緒荣瑟、運(yùn)行、等待摩泪、結(jié)束笆焰。當(dāng)調(diào)用Thread類的start方法,可以啟動一個線程進(jìn)入就緒狀態(tài)见坑;就緒狀態(tài)的線程通過系統(tǒng)調(diào)度嚷掠,可以進(jìn)入運(yùn)行狀態(tài);運(yùn)行狀態(tài)的線程調(diào)用stop或destroy方法荞驴,直接進(jìn)入結(jié)束狀態(tài)不皆;而調(diào)用sleep或者wait等方法,進(jìn)入等待狀態(tài)熊楼,等待事件通知后重新回到就緒隊(duì)列霹娄。

【047 線程中斷的方式及原理】

線程中斷的stop方法,會立即釋放線程持有的鎖進(jìn)入結(jié)束狀態(tài),但不會釋放所占有的資源犬耻;而destroy更加粗暴踩晶,直接結(jié)束進(jìn)程,鎖和資源都不會被釋放枕磁;suspend是把線程掛起合瓢,直到resume后重新回到就緒狀態(tài),但是鎖和資源也都不會被釋放透典。因此晴楔,以上三種方法都不推薦。Interrupt中斷本質(zhì)上是設(shè)置線程的中斷標(biāo)志位峭咒,如果線程在等待狀態(tài)税弃,則拋出中斷異常后,進(jìn)入就緒狀態(tài)凑队,而在運(yùn)行狀態(tài)的線程繼續(xù)運(yùn)行则果,可以通過檢查isInterrupt,來主動退出漩氨。另外在實(shí)際的線程控制中西壮,也是采用標(biāo)志位來輪詢決定是否退出運(yùn)行狀態(tài)的。

【048 線程休眠的方式及原理】

Thread的休眠方法有sleep叫惊、yield和join款青。Sleep是使線程自身休眠指定的ms,然后重新回到就緒狀態(tài)霍狰,不會釋放鎖抡草;yield相當(dāng)于sleep(0),直接進(jìn)入休眠狀態(tài)蔗坯,也不會釋放鎖康震;t.join是掛起線程t,等待調(diào)用該方法的線程執(zhí)行結(jié)束或一段時間后宾濒,重新進(jìn)入就緒狀態(tài)腿短,join函數(shù)最大的特點(diǎn)在于它是一個synchronized的方法,內(nèi)部實(shí)現(xiàn)通過wait函數(shù)來實(shí)現(xiàn)绘梦,因此會釋放占用的鎖橘忱。wait是Object的方法,需要結(jié)合notify或notifyAll來使用谚咬,必須包含在synchronized或者lock來使用鹦付,會釋放占用的鎖尚粘。

【049 生產(chǎn)者-消費(fèi)者案例】

思路:生產(chǎn)者和消費(fèi)者共享產(chǎn)品的內(nèi)存隊(duì)列择卦。多個生產(chǎn)者存放產(chǎn)品時要競爭隊(duì)列鎖,確保資源有序進(jìn)入隊(duì)列,然后去判斷是否有空間秉继,如果有祈噪,存放完產(chǎn)品,通知消費(fèi)者并退出尚辑,如果沒有辑鲤,進(jìn)入wait等待狀態(tài),直到消費(fèi)者發(fā)送notifyAll喚醒杠茬;多個消費(fèi)者消費(fèi)產(chǎn)品時同樣也需要競爭隊(duì)列鎖月褥,確保產(chǎn)品被依次取出。獲得鎖的消費(fèi)者判斷是否有可用資源瓢喉,如果有宁赤,則取出產(chǎn)品,通知生產(chǎn)者并退出栓票,如果沒有决左,進(jìn)入wait等待狀態(tài),直到生產(chǎn)者發(fā)送notifyAll喚醒走贪。只有一把隊(duì)列鎖佛猛,可以保證同一時間,最多只有一個生產(chǎn)者或消費(fèi)者可以訪問隊(duì)列坠狡。

【050 啟動單個線程的方法】

第一種是繼承Thread類或者實(shí)現(xiàn)Runable接口继找,重寫run方法,然后調(diào)用Thread的start方法逃沿,通過底層的native實(shí)現(xiàn)多線程码荔。Thread類本身就實(shí)現(xiàn)了Runable接口,并且內(nèi)部有一個Runable的成員感挥,通過判斷Runable成員是否為NULL缩搅,決定是調(diào)用Thread本身還是Runable對象的run方法。這種方法比較常用触幼,缺點(diǎn)是缺少返回值硼瓣。

第二種是實(shí)現(xiàn)Callable接口的call方法,并通過FutureTask的run方法和get方法實(shí)現(xiàn)線程的運(yùn)行以及得到內(nèi)部成員result的返回值置谦。FutureTask是同時實(shí)現(xiàn)了Future和Runable接口堂鲤。get是一個阻塞方法。

【051 Synchronized和Volatile關(guān)鍵字】

Synchronized在編譯階段會在包含的代碼塊前后分別加上monitorenter和monitorexit監(jiān)視器媒峡,本質(zhì)上也是通過鎖實(shí)現(xiàn)的瘟栖,在Java對象的內(nèi)存分配中會通過對象頭來標(biāo)記鎖狀態(tài),之前提到的偏向鎖谅阿、自旋鎖等都是對synchronized底層實(shí)現(xiàn)的優(yōu)化半哟。Monitor鎖對象會擁有_WaitSet和_EntryList酬滤,用來保存ObjectWaiter對象列表,ObjectWaiter對象就是封裝的等待線程對象寓涨。

Volatile是通過JVM的內(nèi)存模型來實(shí)現(xiàn)的盯串,擁有該關(guān)鍵字的對象每次修改后都會把對象的副本寫會內(nèi)存中,而其余線程讀取該對象都必須從內(nèi)存而不是ThreadLocal中加載戒良。

【052 Lock和Synchronized】

雖然Synchronized本質(zhì)是可重入鎖体捏,但是運(yùn)用上不直接使用鎖的lock和unlock方法方便。另外糯崎,鎖的lock方法可以指定獲取鎖的時間几缭,如果獲取不了,不必阻塞沃呢。

【053 Lock的常用類】

ReentrantLock是最常用的可重入鎖奏司,核心成員private final Sync sync是一個隊(duì)列同步器,由一個等待獲取鎖的隊(duì)列和一個鎖重用計(jì)算器count組成樟插。ReentrantLock的lock方法最后會調(diào)用sync.lock方法實(shí)現(xiàn)韵洋。可以指定鎖為公平鎖還是非公平鎖黄锤。公平鎖是指排在等待隊(duì)列最前面的線程會獲取鎖搪缨,不會出現(xiàn)餓漢問題,但是效率不是最高的鸵熟。而非公平鎖有JVM根據(jù)最優(yōu)分配副编,決定下一個獲取鎖的線程,例如剛剛釋放鎖的線程馬上重新獲取流强,可以避免上下問切換痹届,但會出現(xiàn)餓漢線程。

ReentrantReadAndWriterLock打月,讀寫鎖队腐,同時擁有一把讀鎖和一把寫鎖,讀鎖之間不互斥奏篙,是共享鎖柴淘,而寫鎖是排他鎖。


【054 線程池的工作原理】

線程池的幾個重要變量:分為核心線程數(shù)秘通、最大線程數(shù)为严、阻塞隊(duì)列。但需要一個線程時肺稀,首先會判斷線程池的核心線程數(shù)是否全部創(chuàng)建第股,沒有則直接創(chuàng)建線程放入核心線程池直接使用;如果線程池的核心線程數(shù)已全部創(chuàng)建话原,則先判斷核心線程是否有空閑夕吻,有空閑則調(diào)用空閑線程诲锹;如果沒有空閑線程,則判斷阻塞隊(duì)列是否有空閑可以放入線程梭冠,有則放入,沒有則判斷非核心線程是否有可以使用的改备,有則使用控漠,沒有則交給系統(tǒng)的RejectExceptHandler處理;同時悬钳,完成調(diào)用的線程會去阻塞隊(duì)列中提取等待的線程任務(wù)盐捷。

【054擴(kuò)展線程池的調(diào)用方法】

線程池的頂層抽象類是Executor,子類ExecutorService默勾,常用的是ThreadPoolExecutor碉渡。可以通過構(gòu)造函數(shù)創(chuàng)建常用的4類線程池母剥,然后通過execute方法或者submit方法來實(shí)現(xiàn)具體的調(diào)用滞诺。execute方法可以接收一個runable對象,而submit方法接收一個callable對象并返回Future返回值环疼。

【055 線程池的阻塞隊(duì)列】

① ArrayBlockingQueue习霹,底層是Array,因此是有界FIFO的炫隶,只有一把ReentrantLock淋叶,通過putIndex和getIndex維護(hù)索引;

② LinkedBlockingQueue伪阶,底層是單鏈表結(jié)構(gòu)煞檩,但是有head和last兩個節(jié)點(diǎn)分別標(biāo)識頭尾,實(shí)現(xiàn)尾插入和頭取出栅贴,各有一把ReentrantLock斟湃;

③SynchronizedBlockingQueue,底層沒有任何阻塞隊(duì)列檐薯,每個操作必須等待前一個操作執(zhí)行后才能調(diào)用桐早;

④PriorityBlockingQueue,底層是Array厨剪,但是會通過comparator排序后哄酝,按照優(yōu)先級放入。

【056 常見線程池】

① FixedThreadPoolExecutor祷膳,核心線程數(shù)=最大線程數(shù)=n陶衅,阻塞隊(duì)列LinkedBlockingQueue;

② CachedThreadPoolExecutor直晨,核心線程數(shù)=0搀军,最大線程數(shù)=INTEGER_MAX膨俐,非核心等待時間60s,阻塞隊(duì)列SynchronizedBlockingQueue罩句,適用于異步的短任務(wù)焚刺;

③SingleThreadPoolExecutor,核心線程數(shù)=最大線程數(shù)=1门烂,阻塞隊(duì)列LinkedBlockingQueue乳愉;

④ScheduledThreadPoolExecutor,阻塞隊(duì)列是封裝了PriorityBlockingQueue的DelayQueue屯远。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔓姚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慨丐,更是在濱河造成了極大的恐慌坡脐,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件房揭,死亡現(xiàn)場離奇詭異备闲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捅暴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門浅役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伶唯,你說我怎么就攤上這事觉既。” “怎么了乳幸?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵瞪讼,是天一觀的道長。 經(jīng)常有香客問我粹断,道長符欠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任瓶埋,我火速辦了婚禮希柿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘养筒。我一直安慰自己曾撤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布晕粪。 她就那樣靜靜地躺著挤悉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巫湘。 梳的紋絲不亂的頭發(fā)上装悲,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天昏鹃,我揣著相機(jī)與錄音,去河邊找鬼诀诊。 笑死洞渤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的属瓣。 我是一名探鬼主播载迄,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奠涌!你這毒婦竟也來了宪巨?” 一聲冷哼從身側(cè)響起磷杏,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤溜畅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后极祸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慈格,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年遥金,在試婚紗的時候發(fā)現(xiàn)自己被綠了浴捆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡稿械,死狀恐怖选泻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情美莫,我是刑警寧澤页眯,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站厢呵,受9級特大地震影響窝撵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟铭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一碌奉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寒砖,春花似錦赐劣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茅逮,卻和暖如春璃赡,著一層夾襖步出監(jiān)牢的瞬間判哥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工碉考, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塌计,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓侯谁,卻偏偏與公主長得像锌仅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墙贱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容