1、進程與線程
線程(Lightweight Process,LWP)被稱爲輕量級進程,看名字就可以知道與進程之間的關係。一個程序可以有多個任務,通常每個任務稱爲一個線程(thread)。線程與進程最本質的區別在於:進程有自己的獨立變量,線程則是共享數據。
2、創建線程
public class MyrRun implements Runnable
{
public void run(){
Runnable r = new MyrRun();
Thread t = new Thread(r);
t.start();
}
}
3、線程狀態:
NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。
1、NEW(新生):當剛創建一個進程,並未執行start的時候,改進程處於NEW狀態。
2、RUNNABLE(可運行):當一個進程調用start方法,就進入了RUNNABLE狀態。處於可運行狀態進程不一定是正在運行的,是否運行取決於系統分配給他的運行時間。
3、BLOCKED(被阻塞):當一個線程去申請內部對象鎖,但是這個鎖被其他線程所佔有,此時進入被阻塞狀態。
4、WAITING(等待):當一個線程等待另一個線程通知調度器一個條件是時。
5、TIMED_WAITING(記時等待):有些方法會傳遞超時參數,調用它們使得線程進入計時等待。
6、TERMINATED(終止):一個是run方法結束,自然死亡。另一個是捕獲異常導致線程終端。
API:
java.lang.Thread
thread.State getState():得到線程狀態。
3、進程調度
有兩種調度模型:分時調度模型和搶佔式調度模型。
分時調度模型是指讓所有的線程輪流獲得cpu的使用權,並且平均分配每個線程佔用的CPU的時間片這個也比較好理解。
java虛擬機採用搶佔式調度模型,是指優先讓可運行池中優先級高的線程佔用CPU,如果可運行池中的線程優先級相同,那麼就隨機選擇一個線程,使其佔用CPU。處於運行狀態的線程會一直運行,直至它不得不放棄CPU。
因此,java想要明確進程運行狀態就需要用到一下方法:
讓處於運行狀態的線程調用Thread.sleep()方法 (給予低級線程運行機會)
讓處於運行狀態的線程調用Thread.yield()方法 (給予同等優先級的線程運行機會)
讓處於運行狀態的線程調用另一個線程的join()方法(迫使進程處於阻塞狀態)