線程與進程?
線程是指程序在執行過程中,能夠執行程序代碼的一個執行單元。
線程的狀態4種:運行、就緒、掛起、結束。
進程是指一段正在執行的程序。
一個進程可以擁有多個線程,各個線程之間共享程序的內存空間(代碼段、數據段、堆空間)、進程級資源(比如文件),但是各個線程擁有自己的棧空間。
使用多線程的好處?
使用多線程可以減少程序的響應時間。
與進程相比,線程的創建和切換開銷更小。
多CPU或多核計算機本身就具有執行多線程的能力。
使用多線程能簡化程序的結構,使程序便於理解和維護。一個複雜的進程可以分爲多個線程來執行。
線程的狀態?
1.新建(New):創建後尚未啓動的線程的狀態
2.運行(Runnable):包含Running和Ready
3.無限期等待(Waiting):不會被分配CPU執行時間,需要顯式被喚醒
沒有設置Timeout參數的Object.wait()方法。
沒有設置Timeout參數的Thread.join()方法。
LockSupport.park()方法。
4.限期等待(Timed Waiting):在一定時間後會由系統自動喚醒
Thread.sleep()方法。
設置了Timeout參數的Object.wait()方法。
設置了Timeout參數的Thread.join()方法。
LockSupport.parkNanos()方法。
LockSupport.parkUnitil()方法。
5.阻塞(Blocked):等待獲取排它鎖
6.結束(Terminated):已終止線程的狀態,線程已經結束執行
注意:
在線程run方法執行完後,線程已經處於結束狀態,線程不可以再被喚醒
如果這個時候又調用線程的start方法,將會報錯
線程狀態之間的轉換
1.新建->可運行:執行t.start()
2.可運行->運行:線程被os選中
3.運行->死亡: run()、main()方法結束;異常退出
4.運行->阻塞:等待用戶輸入、Thread.sleep()
5.阻塞->可運行:用戶輸入完成、Thread.sleep()時間結束
6.運行->等待隊列:o.wait()
7.等待隊列->鎖池:synchronized(o);被其他線程喚醒:o.notify()或o.notifyAll()
8.鎖池->可運行:獲得鎖標識
9.運行->可運行:CPU時間片用完;Thread.yield()