SCJP 线程基础
文章目錄
- 一.什么是線程?
- 二.兩種創建線程的方式:
- 三.實例化和啟動一個線程
- 四.線程的生命周期
- 五.何時線程會被阻止運行
- 六.Java線程的優先級
- 七.為什么我們需要wait/notify法則?
- 八.關鍵字synchronized
一.什么是線程?
我們可以用一個生活中的例子來理解它:
在我們生活中我們要做很多不同的事情,對于我們而言,每一件事都可以影響我們生活進程。
上述的每一件事就是每一個線程,我們就是那個程序。
線程表面上看似和主程序并行運行的進程,但和進程不同的是它可以與程序的其他部分共享存儲空間和數據。
二.兩種創建線程的方式:
1.實現Runnable接口
例子:
上述是使用Runnable創建線程的大致過程
2.直接使類繼承Thread
這樣做雖然簡單,但也有一定的局限性,我們知道java只支持單繼承。如果我們的某個對象繼承了Thread,就不能繼承其他類了,或者我們要線程化的對象已經繼承了其他類,這時我們不得不在繼承方面再想辦法了。所以我們不提倡用這個方法
三.實例化和啟動一個線程
盡管在線程中運行的方法是run(),但我們并不需要調用這個方法來啟動一個線程,而是調用start(); 方法來啟動一個線程。原因是線程具有生命周期。
四.線程的生命周期
任務在線程中執行,線程可以是以下5中狀態:
1.新建
2.就緒
3.運行
4.阻塞
5.結束
他們的關系如下圖:
五.何時線程會被阻止運行
一.線程阻塞:
1.線程已經被設置了一定長度的睡眠時間sleep();
2.調用了 suspend() 方法,它將一直保持阻塞直到 resume() 方法被調用
3.該線程因為被調用了 wait() 方法被暫停,當收到notify或者notifyAll消息的時候重新激活。
二.使用Thread包中的yield方法
在Thread包里面構造了一個靜態的名為 yield() 的方法可以讓當前正在運行的線程讓出正在占用的CPU周期返回準備運行的狀態。如果沒有其他的線程,則立馬回到運行狀態。
三.限制/搶占
每一個線程都有一個設定好的CPU占用周期來運行。一旦它用完了設定好的CPU占用周期,它將停止占用CPU讓其他等待的線程獲得CPU。
四.優先級系統
在多個線程正在運行的時候一個相對來說最高優先級的線程突然插入,它將直接獲得CPU,其他線程被迫停止。
六.Java線程的優先級
我們可以通過Thread包中的 Thread.setPriority 來設置線程的優先級,通過 getPriority() 來獲得線程的優先級,一個新建線程的默認優先級是Thread.NORM_PRIORITY.
七.為什么我們需要wait/notify法則?
編寫代碼的時候使用同步的wait,notify和notifyAll方法,以防止并行讀取問題的發生,同時保證各個線程之間的正常通信。
八.關鍵字synchronized
此關鍵字可以用在標記一段聲明或者鎖定一段代碼,保證在同一時間只有一個線程能夠運行它的實例。wait和notify應該放在此關鍵字標記的代碼中來保證當前代碼在監視器的監控之中。
總結