二、 在Java中實現多線程
每個程序至少自動擁有一個線程,稱爲主線程。當程序加載到內存時,啓動主線程。Java 程序中的public static void main( )方法是主線程的人口,運行Java程序時,會先執行這個方法。
開發中, 用戶編寫的線程般都是指除了主線程之外的其他線程。
使用一個線程的過程,可以分爲4個步驟:
(1)定義一個線程,同時指明這個線程所要執行的代碼,即期望完成的功能。
(2)創建線程對象。
(3)啓動線程。
(4)終止線程。
定義一個線程類通常有兩種方法,分別是繼承java.lang.Thraed類和實現ava.lang.Runnable接口。
2.1使用Thread類創建線程
Java提供了java.lang. Thread類支持名線程編程,該類提供了大量的方法來控制和操作線程,如表2-1所示。這些方法可以先初步瞭解,後面使用到時再深人學習。
表2-1 Thread類常用方法
方法 | 說明 |
void run( ) | 執行任務操作的方法 |
void start( ) | 使該線程開始執行 |
void sleep(long millis) | 在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行) |
String getName( ) | 返回該線程的名稱 |
int getPriority() | 返回線程的優先級 |
void setPriority(int newPriority) | 更改線程的優先級 |
Thread.State getState() | 返回該線程的狀態 |
boolcean isAlive( ) | 測試線程是否處於活動狀態 |
void join( ) | 等待該線程終止 |
void interrupt( ) | 中斷線程 |
void yield() | 暫停當前正在執行的線程對象,並執行其他線程 |
創建線樣時繼承Thread 類並重寫Thread類的run( )方法。Thread 類的run( )方法是線程要執行操作任務的方法,所以線程要執行的操作代碼都需要寫在run( )方法中,並通過調用start( )方法來啓動線程。
示例1
使用繼承Thread類的方式創建線程,在線程中輸出1~100的整數。
實現步驟:
(1)定義MyThread類繼承Thread類,重寫run( )方法, 在run( )方法中實現數據輸出.
(2)創建線程對象。
(3)調用start( )方法啓動線程。
關鍵代碼:
//通過繼承Thread類來創建線程
public class MyThread extends Thread{
private int count=0;
//重寫run()方法
public void run(){
while (count<100) {
count++;
system.out.println ("count的值是: "+count);
}
}
}
//啓動線程
publlc class Test{
public static vold main(String args){
//實例化線程對象
MyThread mt = new MyThread();
//啓動線程
mt.start();
}
}
由示例1可以看出,創建線程對象時將不會開啓線程,必須到用線是對象的start( )方法才能使線程開始執行。
2.2使用Runnable接口創建線程
使用繼承Thread類的方式創建線程簡單明瞭,符合大家的習慣,但它也有一個缺點, 如果定義的類已經繼承其他類則無法再繼承Thread類。使用Runnable接口創建線程的方式可以解決上述問題。Runnable接口中聲明瞭一個run( )方法,即public void run()。一個類可以通過實現 Runmable接口並實現其run( )方法完成線程的所有活動,已實現的run( )方法稱爲該對象的線程體。任何實現Runnable接口的對象都可以作爲一個線程的目標對象。
示例2
使用實現Runnable接口的方式創建線程,在線程中輸出1~100的整數。
實現步驟:
(1)定義MyThread類實現java.lang.Runnable接口,並實現Runnable接口的run( )方法,在run( )方法中實現輸出數據。
(2)創建線程對象。
(3)調用star( )方法啓動線程,
關鍵代碼:
//通過實現Runnable樓口創建線程
publie class MyThread implements Runnable{
private int count = 0;
//實現run()方法
public void run(){
while (count<100){
count++;
System .out .printin("count的值是: "+count);
}
}
}
//啓動線程
public class Test{
publie statie vold main(string args){
//創建線程對象,將實現Runnable的線程類對象作爲參數
Thread thread = new Thread(new MyThread());
//啓動線程
thread.start();
}
}
示例2中,通過Thread tread=new Thread(new MyThread( ))創建線程對象。
兩種創建線程的方式有各白的特點和應用領域:直接繼承Thread類的方式編寫簡單,可以直接操作線程,適用於單重繼承的情況;實現Runnable接口的方式,當一個線程繼承了另一個類時,就只能用實現Runnable 接口的方法來創建線程,而且這種方式還可以使名個線程之間使用同一個Runnable對象。