Java給多線程編程提供了內(nèi)置的支持袱瓮。一個(gè)多線程程序包含兩個(gè)或多個(gè)能并發(fā)運(yùn)行的部分缤骨。程序的每一部分都稱作一個(gè)線程,并且每個(gè)線程定義了一個(gè)獨(dú)立的執(zhí)行路徑尺借。
多線程是多任務(wù)的一種特別的形式绊起。多線程比多任務(wù)需要更小的開銷。
這里定義和線程相關(guān)的另一個(gè)術(shù)語(yǔ):進(jìn)程:一個(gè)進(jìn)程包括由操作系統(tǒng)分配的內(nèi)存空間燎斩,包含一個(gè)或多個(gè)線程虱歪。一個(gè)線程不能獨(dú)立的存在,它必須是進(jìn)程的一部分栅表。一個(gè)進(jìn)程一直運(yùn)行笋鄙,直到所有的非守候線程都結(jié)束運(yùn)行后才能結(jié)束。
多線程能滿足程序員編寫非常有效率的程序來(lái)達(dá)到充分利用CPU的目的怪瓶,因?yàn)镃PU的空閑時(shí)間能夠保持在最低限度萧落。
- 新狀態(tài): 一個(gè)新產(chǎn)生的線程從新狀態(tài)開始了它的生命周期。它保持這個(gè)狀態(tài)知道程序start這個(gè)線程。
- 運(yùn)行狀態(tài):當(dāng)一個(gè)新狀態(tài)的線程被start以后铐尚,線程就變成可運(yùn)行狀態(tài)拨脉,一個(gè)線程在此狀態(tài)下被認(rèn)為是開始執(zhí)行其任務(wù)
- 就緒狀態(tài):當(dāng)一個(gè)線程等待另外一個(gè)線程執(zhí)行一個(gè)任務(wù)的時(shí)候,該線程就進(jìn)入就緒狀態(tài)宣增。當(dāng)另一個(gè)線程給就緒狀態(tài)的線程發(fā)送信號(hào)時(shí)玫膀,該線程才重新切換到運(yùn)行狀態(tài)。
- 休眠狀態(tài): 由于一個(gè)線程的時(shí)間片用完了爹脾,該線程從運(yùn)行狀態(tài)進(jìn)入休眠狀態(tài)帖旨。當(dāng)時(shí)間間隔到期或者等待的時(shí)間發(fā)生了,該狀態(tài)的線程切換到運(yùn)行狀態(tài)灵妨。
- **終止?fàn)顟B(tài): **一個(gè)運(yùn)行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生解阅,該線程就切換到終止?fàn)顟B(tài)。
線程的優(yōu)先級(jí)
每一個(gè)Java線程都有一個(gè)優(yōu)先級(jí)泌霍,這樣有助于操作系統(tǒng)確定線程的調(diào)度順序货抄。Java優(yōu)先級(jí)在MIN_PRIORITY(1)和MAX_PRIORITY(10)之間的范圍內(nèi)。默認(rèn)情況下朱转,每一個(gè)線程都會(huì)分配一個(gè)優(yōu)先級(jí)NORM_PRIORITY(5)蟹地。
具有較高優(yōu)先級(jí)的線程對(duì)程序更重要,并且應(yīng)該在低優(yōu)先級(jí)的線程之前分配處理器時(shí)間藤为。然而怪与,線程優(yōu)先級(jí)不能保證線程執(zhí)行的順序,而且非常依賴于平臺(tái)缅疟。
創(chuàng)建一個(gè)線程
Java提供了兩種創(chuàng)建線程方法:
通過實(shí)現(xiàn)Runable接口分别;
// 創(chuàng)建一個(gè)新的線程 通過實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程
class NewThread implements Runnable {
Thread t;
NewThread() {
// 創(chuàng)建第二個(gè)新線程
// 在創(chuàng)建一個(gè)實(shí)現(xiàn)Runnable接口的類之后,你可以在類中實(shí)例化一個(gè)線程對(duì)象存淫。
// Thread定義了幾個(gè)構(gòu)造方法耘斩,下面的這個(gè)是我們經(jīng)常使用的:
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
// 新線程創(chuàng)建之后,調(diào)用它的start()方法它才會(huì)運(yùn)行
t.start(); // 開始線程
}
// 為了實(shí)現(xiàn)Runnable纫雁,一個(gè)類只需要執(zhí)行一個(gè)方法調(diào)用run()煌往,聲明如下:
// 第二個(gè)線程入口
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
// 暫停線程
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
public class ThreadDemo {
public static void main(String args[]) {
new NewThread(); // 創(chuàng)建一個(gè)新線程
try {
for(int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
- 通過繼承Thread來(lái)創(chuàng)建線程
創(chuàng)建一個(gè)線程的第二種方法是創(chuàng)建一個(gè)新的類倾哺,該類繼承Thread類轧邪,然后創(chuàng)建一個(gè)該類的實(shí)例。
繼承類必須重寫run()方法羞海,該方法是新線程的入口點(diǎn)忌愚。它也必須調(diào)用start()方法才能執(zhí)行。
// 通過繼承 Thread 創(chuàng)建線程
class NewThread extends Thread {
NewThread() {
// 創(chuàng)建第二個(gè)新線程
super("Demo Thread");
System.out.println("Child thread: " + this);
start(); // 開始線程
}
// 第二個(gè)線程入口
public void run() {
try {
for(int i = 5; i > 0; i--) {
System.out.println("Child Thread: " + i);
// 讓線程休眠一會(huì)
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
public class ExtendThread {
public static void main(String args[]) {
new NewThread(); // 創(chuàng)建一個(gè)新線程
try {
for(int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i);
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
線程的幾個(gè)主要概念
- 在多線程編程時(shí)却邓,你需要了解以下幾個(gè)概念:
- 線程同步
- 線程間通信
- 線程死鎖
- 線程控制:掛起硕糊、停止和恢復(fù)