Java并發(fā)編程必知必會(huì)
1.什么是進(jìn)程?
進(jìn)程是系統(tǒng)中正在運(yùn)行的一個(gè)程序,程序一旦運(yùn)行就是進(jìn)程。
進(jìn)程可以看成程序執(zhí)行的一個(gè)實(shí)例。進(jìn)程是系統(tǒng)資源分配的獨(dú)立實(shí)體,每個(gè)進(jìn)程都擁有獨(dú)立的地址空間。一個(gè)進(jìn)程無(wú)法訪問(wèn)另一個(gè)進(jìn)程的變量和數(shù)據(jù)結(jié)構(gòu),如果想讓一個(gè)進(jìn)程訪問(wèn)另一個(gè)進(jìn)程的資源,需要使用進(jìn)程間通信,比如管道,文件,套接字等。
2.什么是線程?
是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
3.線程的實(shí)現(xiàn)方式?
1.繼承Thread類
2.實(shí)現(xiàn)Runnable接口
3.使用Callable和Future
4.Thread 類中的start() 和 run() 方法有什么區(qū)別?
1.start()方法來(lái)啟動(dòng)線程,真正實(shí)現(xiàn)了多線程運(yùn)行。這時(shí)無(wú)需等待run方法體代碼執(zhí)行完畢,可以直接繼續(xù)執(zhí)行下面的代碼;通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程, 這時(shí)此線程是處于就緒狀態(tài), 并沒(méi)有運(yùn)行。然后通過(guò)此Thread類調(diào)用方法run()來(lái)完成其運(yùn)行操作的, 這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容, Run方法運(yùn)行結(jié)束, 此線程終止。然后CPU再調(diào)度其它線程。
2.run()方法當(dāng)作普通方法的方式調(diào)用。程序還是要順序執(zhí)行,要等待run方法體執(zhí)行完畢后,才可繼續(xù)執(zhí)行下面的代碼;程序中只有主線程------這一個(gè)線程, 其程序執(zhí)行路徑還是只有一條, 這樣就沒(méi)有達(dá)到寫線程的目的。
5.線程N(yùn)EW狀態(tài)
new創(chuàng)建一個(gè)Thread對(duì)象時(shí),并沒(méi)處于執(zhí)行狀態(tài),因?yàn)闆](méi)有調(diào)用start方法啟動(dòng)改線程,那么此時(shí)的狀態(tài)就是新建狀態(tài)。
6.線程RUNNABLE狀態(tài)
線程對(duì)象通過(guò)start方法進(jìn)入runnable狀態(tài),啟動(dòng)的線程不一定會(huì)立即得到執(zhí)行,線程的運(yùn)行與否要看cpu的調(diào)度,我們把這個(gè)中間狀態(tài)叫可執(zhí)行狀態(tài)(RUNNABLE)。
7.線程的RUNNING狀態(tài)
一旦cpu通過(guò)輪詢貨其他方式從任務(wù)可以執(zhí)行隊(duì)列中選中了線程,此時(shí)它才能真正的執(zhí)行自己的邏輯代碼。
8.線程的BLOCKED狀態(tài)
線程正在等待獲取鎖。
進(jìn)入BLOCKED狀態(tài),比如調(diào)用了sleep,或者wait方法
進(jìn)行某個(gè)阻塞的io操作,比如因網(wǎng)絡(luò)數(shù)據(jù)的讀寫進(jìn)入BLOCKED狀態(tài)
獲取某個(gè)鎖資源,從而加入到該鎖的阻塞隊(duì)列中而進(jìn)入BLOCKED狀態(tài)
9.線程的TERMINATED狀態(tài)
TERMINATED是一個(gè)線程的最終狀態(tài),在該狀態(tài)下線程不會(huì)再切換到其他任何狀態(tài)了,代表整個(gè)生命周期都結(jié)束了。
下面幾種情況會(huì)進(jìn)入TERMINATED狀態(tài):
線程運(yùn)行正常結(jié)束,結(jié)束生命周期
線程運(yùn)行出錯(cuò)意外結(jié)束
JVM Crash 導(dǎo)致所有的線程都結(jié)束
10.后記
更多多線程資料詳見(jiàn) shimo.im/docs/2E7V3AjOJNwiYsWE/ 。