一. 快速認(rèn)識(shí)線程
在我們?nèi)粘V?當(dāng)討論到并行時(shí),其實(shí)是指很多的程序任務(wù)在同時(shí)的運(yùn)行.如當(dāng)你在看一部電影的時(shí)候,還能打開扣扣和你心愛的女朋友談情說(shuō)愛聊著騷.在單CPU中,其實(shí)是不能同時(shí)運(yùn)行的,在多核CPU中是可以并行的.
二. 線程的介紹
在計(jì)算機(jī)中,一個(gè)程序任務(wù)就是一個(gè)進(jìn)程,進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空間內(nèi).而每一個(gè)進(jìn)程里面都至少有一個(gè)線程在運(yùn)行,線程是進(jìn)程的基本執(zhí)行單元,有時(shí)候一個(gè)線程也稱為輕量級(jí)的進(jìn)程.
三. 一個(gè)簡(jiǎn)單的線程例子
public class thread1 {
public static void main(String[] args) {
browseNews();
enjoyMusic();
}
/**
* look at the news
*/
private static void browseNews() {
for (int i = 0;i<5;i++) {
System.out.println("uh``,the good news");
sleep(1);
}
}
/**
* listen to music
*/
private static void enjoyMusic() {
for (int i = 0;i<5;i++) {
System.out.println("uh``,the nice music");
sleep(1);
}
}
/**
* exception
* @param seconds
*/
private static void sleep(int seconds) {
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我們寫這段代碼本來(lái)是想讓聽音樂和看新聞是同時(shí)進(jìn)行的,也就是在控制臺(tái)交替輸出,然而并不是這樣的,因?yàn)槲以趂or循環(huán)里加了條件,所以控制臺(tái)的輸出是一直在輸出看新聞,然后聽音樂,如果我沒有限制條件,則會(huì)一直輸出看新聞,聽音樂的任務(wù)永遠(yuǎn)都得不到執(zhí)行.控制臺(tái)輸出如下:
四. 如何讓其并發(fā)運(yùn)行交替輸出
借助Thread,并且我還用了java1.8里面的lambda表達(dá)式,代碼如下:
public static void main(String[] args) {
new Thread(thread1::browseNews).start();
enjoyMusic();
}
控制臺(tái)輸出如下:
其完整寫法為:
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
browseNews();
}
}.start();
enjoyMusic();
}
上面代碼的意思是我們創(chuàng)建了一個(gè)線程,重寫了其run方法,并將browseNews()看新聞交給它執(zhí)行;然后調(diào)用start()方法,啟動(dòng)一個(gè)新的線程.
五. 線程的生命周期
- NEW 新建 用關(guān)鍵字new創(chuàng)建一個(gè)Thread對(duì)象,代表線程的狀態(tài)為new狀態(tài),此時(shí)它不能運(yùn)行,因?yàn)椴]有啟動(dòng),和其他Java對(duì)象一樣,new狀態(tài)可以通過start方法進(jìn)入runnable狀態(tài).
- RUNNABLE 就緒 調(diào)用start方法進(jìn)入runnable,此時(shí)線程在JVM真正的創(chuàng)建,但是線程一經(jīng)啟動(dòng)并不會(huì)直接運(yùn)行,這還要取決于CPU的調(diào)度,這個(gè)中間狀態(tài)我們稱為可執(zhí)行狀態(tài),它具備了執(zhí)行的的資格,聽候CPU的調(diào)度.
-
RUNNING 運(yùn)行 線程獲得CPU資源,開始執(zhí)行任務(wù)(run()方法),當(dāng)使用完系統(tǒng)分配的時(shí)間后挪蹭,系統(tǒng)就會(huì)剝脫該線程占用的CPU資源呈础,讓其他線程獲得執(zhí)行的機(jī)會(huì).此時(shí)除非此線程自動(dòng)放棄CPU資源或者有優(yōu)先級(jí)更高的線程進(jìn)入霍弹,線程將一直運(yùn)行到結(jié)束
-
BLOCKED 阻塞 線程讓出CPU并暫停自己的執(zhí)行,即進(jìn)入堵塞狀態(tài).上圖中已經(jīng)介紹了什么情況下會(huì)進(jìn)入阻塞狀態(tài)了
bolcked狀態(tài)的線程可以轉(zhuǎn)換為以下的狀態(tài):
- TERMINATED 死亡(DEAD)此狀態(tài)說(shuō)明線程的聲明周期結(jié)束,將不會(huì)再切換到任何狀態(tài),線程將不再擁有運(yùn)行的資格
持續(xù)更新........