1. 程式人生 > >java多執行緒--【Foam番茄】

java多執行緒--【Foam番茄】

### 程序 是系統資源分配的單位 ### 執行緒 通常在一個程序中可以包含若干個執行緒,當然一個程序中至少有一個執行緒,不然沒有存在的意義。執行緒是cpu排程和執行的單位 ``` 注意:很多多執行緒是模擬出來的,真正的多執行緒是指有多個cpu,即多核,如伺服器。如果是模擬出來的多執行緒,即在一個cpu的情況下,在同一個時間點,cpu只能執行一個程式碼,因為切換的很快,所以就有同時執行的錯覺 ``` - 執行緒就是獨立的執行路徑 - 在程式執行時,即使沒有自己建立執行緒,後臺也會有多個執行緒,如主執行緒,gc執行緒 - main()稱之為主執行緒,為系統的入口,用於執行整個程式 - 在一個程序中,如果開闢了多個執行緒,執行緒的執行由排程器安排排程,排程器是與作業系統密切相關的,先後順序是不能人為的干預的 - 對同一份資源操作時,會存在資源搶奪的問題,需要加入併發控制 - 執行緒會帶來額外的開銷,如cpu排程時間,併發控制開銷 - 每個執行緒在自己的工作記憶體互動,記憶體控制不當會造成資料不一致 ### 執行緒建立 三種建立方式 Thread class ==》》繼承Thread類(重點) Runnable介面 ==》》實現Runnable介面(重點) Callable介面 ==》》實現Callable介面(瞭解) ### Thread - 自定義執行緒類繼承==Thread類== - 重寫==run()==方法,編寫執行緒執行體 - 建立執行緒物件,呼叫==start()==方法啟動執行緒 總結:注意,**執行緒開啟不一定立即執行,由cpu排程執行** ### Callable - 可以定義返回值 - 可以丟擲異常 ### Runnable - 定義MyRunnable類實現==Runnable==介面 - 實現==run()== 方法,編寫執行緒執行體 - 建立執行緒物件,呼叫==start()== 方法啟動執行緒 推薦使用Runnable物件,因為java**單繼承的侷限性** ### 小結 繼承Thread類 - 子類繼承Thread類具備多執行緒能力 - 啟動執行緒:子類物件.start() - 不建議使用:避免oop單繼承侷限性 實現Runnable介面 - 實現介面Runnable具有多執行緒能力 - 啟動執行緒:傳入目標物件+Thread物件.start() - 推薦使用:避免單繼承侷限性,靈活方便,方便同一個物件被多個執行緒使用 實現Callable介面(瞭解即可) - 實現Callable介面,需要返回值型別 - 重寫call方法,需要丟擲異常 - 建立目標物件 - 建立執行服務:ExecutorService ser = Executors.newFixedThreadPool(1) - 提交執行