多線程,java多線程
程式是對資料描述與操作的代碼的集合,如Office中的Word,暴風影音等應用程式。
進程是程式的一次動態執行過程,它對應了從代碼載入、執行至執行完畢的一個完整過程。
進程的特點:
①:進程是系統運行程式的基本程式。
②:每一個進程都有自己獨立的一塊記憶體空間、一組資源資源。
③:每一個進程的內部資料和狀態都是完全獨立的。
進程包括系統進程(有作業系統內部建立的進程)和使用者進程(由使用者程式建立的進程)。
每個進程中,至少建立一個線程,來作為這個程式啟動並執行進入點。
在一個進程中同時運行了多個線程,用來完成不同的工作,則稱為“多線程”。
多線程的好處:
①:充分利用CPU的資源:執行單線程是,若程式發生阻塞,CPU可能處於空閑,造成資源浪費;而使用多線程可以在發生阻塞時運行其他線程,大大提高利用率
②:簡化編程模型:一個即長又複雜的進程可以考慮分為多個線程,成為幾個獨立的運行部分。
③:帶來良好的使用者體驗:多個線程交替執行,減少或避免因程式阻塞或意外情況造成的響應過慢現象,降低了使用者等待的機率。
Thread類的常用方法
Thread(): 分配新的Thread對象
Thread(Runnable target): 分配新的Thread對象,target為run()方法被調用的對象
Thread(Runnable target,String name): 分配新的Thread對象,target為run()方法被調用的對象,name為新線程的名稱
void run(): 執行任務操作的方法
void start(): 使該線程開始執行,Java虛擬機器調用該線程的run()方法
void sleep(long millis) 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行)
String getName() 返回該線程的名稱。
int getPriority() 返回線程的優先順序。
void setPriority(int newPriority) 更改線程的優先順序。
static Thread currentThread(): 返回當前正在執行的線程對象的引用
boolean isAlive(): 測試線程是否處於活動狀態
void join() 等待該線程終止。
void interrupt() 中斷線程。
void yield() 暫停當前正在執行的線程對象,並執行其他線程。
boolean isDaemon() 測試該線程是否為守護線程。
void setDaemon(boolean on) 將該線程標記為守護線程或使用者線程。
void setName(String name) 改變線程名稱,使之與參數 name 相同。
從Object類繼承來的方法 void notify() void wait()
主線程
在Java程式啟動時,一個線程立刻運行,該程式通常稱為程式的主線程。
①:它是產生其他子線程的線程。
②:通常它必須最後完成執行,因為它執行各種關閉動作。
使用一個線程的過程,分為四個步驟:
①:定義一個線程,同時指明這個線程所要執行的代碼,即期望完成的功能。
②:建立線程對象。
③:啟動線程
④:終止線程。
建立線程類的兩種方法:一個是繼承Thread類,另一個是實現Runnable介面。
繼承Thread類:
1、擴充java.lang.Thread類。
此類中有個run()方法,應該注意其用法:
public void run()
如果該線程是使用獨立的Runnable運行物件建構的,則調用該Runnable對象的run方法;否則,該方法不執行任何操作並返回。
①:編寫簡單,可直接操作線程。
②:適用於單繼承。
注意:已啟動的線程對象不能再次調用start()方法,否則會拋出IllegalThreadStateException異常(線程沒有處於請求操作所需要的適當狀態時拋出的異常)。
線程執行個體調用start()方法和直接調用run()方法有什麼區別?
start()是啟動程式,run()是調用執行個體方法。
實現Runnable介面
2、實現java.lang.Runnable介面。
void run()
使用實現介面Runnable的對象建立一個線程時,啟動該線程將導致在獨立執行的線程中調用對象的run方法。
方法run的常規協定是,它可能執行任何所需的操作。
①:避免單繼承局限性
②:便於共用資源
一個類可以通過實現Runnable介面並實現其run()完成線程的所有活動,已實現的run()方法稱為該線程對象的線程體。
例題1:建立兩個線程,每個線程均輸出20次訊息數字、“你好”、線程名。
/** * 繼承Thread的類 * @author 顥6 * */public class MyThread extends Thread{ public void run(){ for (int i = 1; i <=20; i++) { System.out.println("你好,來自線程"+Thread.currentThread().getName()+":"+i); } }}
/** * 測試Thread類實現的多線程程式 * @author 顥6 * */public class TestStart { public static void main(String[] args) { MyThread mt1=new MyThread(); mt1.start(); Thread t1=new Thread(new MyThread()); t1.start(); }}
例題2:使用實現Runnable介面的方式建立線程類,修改測試類別
/** * 實現Runnable介面的類 * @author Administrator * */public class MyThread implements Runnable{ public void run() { for (int i = 1; i <=20; i++) { System.out.println(i+".你好,來自線程"+Thread.currentThread().getName()); } }}
/** * 測試Runnable類的實現多線程程式 * @author 顥6 * */public class Test { public static void main(String[] args) { Thread myS=new Thread(new MyThread()); myS.start(); }}
線程的狀態
任何線程一般都具有五種狀態,即建立、就緒、運行、阻塞、死亡狀態。
建立狀態:在程式中用構造方法建立了一個線程對象後,新的線程對象就處於建立狀態。
就緒狀態:線程建立之後,就可以通過調用start()方法啟動線程,即進入就緒狀態。
運行狀態:當就緒狀態的線程獲得CPU資源是,即可進入運行狀態,執行run()方法。
阻塞狀態:一個正在啟動並執行線程因某種原因不能繼續運行時,進入阻塞狀態。
①:由於線程優先順序比較低,因此它不能獲得CPU資源。
②:使用sleep()方法使線程休眠。
③:通過調用wait()方法,是線程等待。
④:通過調用yield(),線程顯式出讓CPU控制權。
⑤:線程由於等待一個檔案,I/O事件被阻塞。
死亡狀態:一個線程的run()方法運行完畢,則進入死亡狀態。