線程相關
Java多線程實現方式
繼承Thread,實現Runnable接口,實現Callable接口(能拋異常且有返回值,不經常使用)網絡
爲何有了繼承Thread方式還要有Runnable接口方式
實現接口的方式適合多個相同程序代碼的線程去處理同一個資源,能夠避免Java中單繼承的限制多線程
爲何JVM啓動是多線程的?
由於至少啓動了兩個線程:主線程、垃圾回收線程併發
線程和進程的含義
進程:是操做系統資源分配的基本單位,正在運行的程序socket
線程:是任務調度和執行的基本單位,程序使用CPU的最基本單位spa
多線程和多進程的含義
多進程:操做系統能同時運行多個任務即程序操作系統
多線程:同一程序中有多個順序流在執行線程
併發和並行的含義
並行:邏輯上同時發生,一段時間內同時運行多個程序對象
併發:物理上同時發生,一個時間點同時運行多個程序blog
線程和進程的區別
不一樣點 | 進程 | 線程 |
一個進程裏有多個線程 | ||
內存 | 不共享內存 | 共享內存 |
資源 | 進程間共享文件網絡資源 | 線程間不共享 |
開銷 | 進程須要分配內存,開銷較大 | 線程只須要分配棧和一個PC,開銷較小 |
獨立 | 能夠獨立存在 | 能夠獨立,必須依賴進程而存在 |
做用 | 進程是CPU資源分配的最小單位 | 線程是CPU調度的最小單位 |
通訊 | 進程間的通訊比較複雜由於它的數據空間獨立性,須要經過操做系統,基於socket的進程間的通訊機制 | 而線程間的通訊因爲多線程共享地址空間和數據空間,可直接通訊,沒必要經過操做系統(內核的調度) |
線程調度模型
分時調度模型:全部線程輪流使用CPU的使用權,平均分配每一個線程佔用CPU的時間片繼承
搶佔式調度模型:優先讓優先級高的線程使用CPU,得到CPU時間片也越多,Java使用此模型
線程間通訊——生產者消費者模式
生產者:先看是否有數據,有就等待消費者消費(wait),沒有就生產,生產完後通知消費者消費
消費者:先看是否有數據,有就消費,沒有就等待生產者生產,通知生產者生產數據(notify)
Java線程調度方式
線程睡眠:Thread.sleep(long millis),使線程轉換到阻塞狀態,當睡眠結束後,就轉爲就緒狀態
線程等待:Object.wait(),致使當前的線程等待,直到其餘線程調用此對象的notify()或notifyAll()
線程喚醒:Object.notify()方法,喚醒在此對象上等待的單個線程。
線程讓步:Thread.yield(),暫停當前正在執行的線程對象,把執行機會讓給相同或更高優先級的線程
線程加入:join(),等待其餘線程終止
線程狀態
初始狀態:建立一個線程
就緒狀態:線程調用start()方法
運行狀態:線程被CPU調度
阻塞狀態:放棄CPU使用權,暫停完畢後變回就緒狀態(同步阻塞,等待阻塞,其餘阻塞)
死亡狀態:線程執行完或因異常退出了run()方法,線程結束了生命週期