最近專案中查詢百萬數量級資料用到了多執行緒技術,順便藉著這次實踐機會把多執行緒原始碼理了一下,仔細區分了一下裡面比較容易混淆的幾組方法,在此做個小結。
第一組:runnable介面和callable介面
runnable方法中定義乙個唯一的run()方法,callable中定義乙個唯一的call()方法。通過閱讀原始碼,我們知道,run()方法中的邏輯會在乙個新執行緒中執行,它沒有返回值;與此不同,call()方法會返回執行結果,或者丟擲異常。實際操作過程中,實現runnable介面的情況很多。
相同點:兩個方法都無參
順便提一嘴,兩個介面都是函式式介面(functionalinte***ce),在具體**中可以使用lambda表示式實現。
第二組:execute方法和submit方法
execute方法接受runnable命令,執行runnable任務。可以在乙個新執行緒中、執行緒池中、call()的執行緒中執行,沒有返回值。
submit顧名思義,提交,提交runnable任務,會返回乙個代表本次任務的future物件,如果成功執行則返回null。這兩個方法我實際使用中沒有什麼差別,看個人需要,如果你需要返回值比如有時候會執行失敗,你需要具體的一些資訊,那麼可以使用submit方法。
第三組:shutdown和shutdownnow方法
shutdown方法一開始我完全沒有注意,後來在dubug的時候發現了問題:因為主程式和查詢執行緒是非同步的,shutdown之後,任務不會受到影響嗎?
首先,我們開啟執行緒池後,一定要在後面**執行shutdown(關閉),否則會造成資源洩漏,程式執行也可能出狀況。那麼我們不經要問:shutdown之後,程式發生了什麼?
主程式執行shutdown後,正在執行(running)的程式不受干擾,阻塞佇列中已經存在的任務也會得到執行,同時阻塞佇列不再接受新任務入隊。shutdownnow方法被呼叫,正在執行的方法會立即終止,阻塞佇列中的任務會以任務列表的形式返回。
多執行緒的東西還是很多的,貪多嚼不爛,以後應用的過程中勤動手翻一翻原始碼,相信理解會越來越深入。
多執行緒中的join 方法
直接看 package net.csdn.demo01 public class mythread extends thread package net.csdn.demo01 public class testmythread 執行結果 張三 1張三 2張三 3張三 4張三 5張三 6張三 7張三...
多執行緒 執行緒中中斷執行緒的方法
public class threaddemo13 catch interruptedexception e system.out.println 交易終止 t1.start thread.sleep 2000 system.out.println 有內鬼終止交易 flag true public ...
(40)多執行緒 實現多執行緒方法
建立執行緒用法 1.繼承thread,重寫run 方法,建立子類物件 a a new a 執行緒開始執行 a.start 2.實現runnable介面,實現run 方法,建立實現類物件 a a new a 建立 類物件 thread t new thread a 執行緒開始執行 t.start 上面...