Java多執行緒的使用(二)
今天來講講Java如何建立一個執行緒。
大多數情況下,透過例項化一個Thread物件來建立一個執行緒,Java定義了兩種方式:
實現Runnable介面
繼承Thread類
實現Runnable介面
建立執行緒的最簡單的方法就是建立一個Runnable口的類。Runnable抽象了一個執行程式碼單元。為實現Runnable介面,一個類僅需實現一個run()的簡單方法,在run()方法中可以定義程式碼來構建新的執行緒。建立一個執行緒必須理解下面這段話:
run()方法能夠讓主執行緒那樣呼叫其他方法,引用其他類,宣告變數。僅有的不同的是run()方法在程式中確立另一個併發的執行緒執行入口。當run()方法執行完畢時,該執行緒結束。
在你已經建立了實現Runnable介面的類以後,你要在類內部例項化一個Thread類的物件。
Thread(Runnable threadOb,String threadName)
該建構函式中,threadOb時一個實現Runnable介面的實現類,threadName引數則是你新建執行緒的執行緒名稱,這定義了執行緒執行的起點。
建立了新的執行緒,它並不能執行,需要呼叫start方法來執行執行緒的run()方法。本質上,start()方法執行的是一個對run()的呼叫。
public class Test1 {
public static void main(String[] args) throws InterruptedException {
new XkThread();
try {
for(int i=1;i
Thread.currentThread().sleep(1000);//讓當前執行緒睡眠1秒
System.out.println("大家好,我是主執行緒:"+i);
}
//需要捕獲sleep()方法可能丟擲的異常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class XkThread implements Runnable {
private Thread th;
public XkThread() {
th=new Thread(this);
System.out.println("開始呼叫run()方法");
th.start();//呼叫run()方法
}
@Override
public void run() {
try {
for(int i=1;i
th.sleep(1000);//讓執行緒睡眠1秒
System.out.println("大家好,我是子執行緒:"+i);
}
//需要捕獲sleep()方法可能丟擲的異常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在NewThread中建構函式中,新的Thread物件由下面語句建立:
th=new Thread(this);
透過前面的語句this表明了在this物件中你想要新的執行緒呼叫run()方法。然後start()被呼叫,以run()方法為開始啟動了執行緒的執行。這使子執行緒for迴圈開始執行。呼叫start()方法之後,NewThread的建構函式返回到main()。當主執行緒被恢復,主執行緒開始執行自己的for迴圈。兩個執行緒同時執行,共享CPU,直到它們的迴圈結束。
執行結果:
開始呼叫run()方法
大家好,我是主執行緒:1
大家好,我是子執行緒:1
大家好,我是子執行緒:2
大家好,我是主執行緒:2
大家好,我是子執行緒:3
大家好,我是主執行緒:3
//省略
繼承Thread類
建立執行緒的另一個途徑就是繼承Thread類,然後建立子類的例項。當一個類繼承Thread類時,它必須重寫run()方法,這個run()方法時新執行緒的入口。它也必須呼叫start()方法來啟用新執行緒執行。
public class Test2 {
public static void main(String[] args) {
new MyThread("child Thread");
System.out.println("開始執行主執行緒的for迴圈");
try {
for(int i=1;i
Thread.currentThread().sleep(1000);//讓主執行緒睡眠1秒
System.out.println("大家好,我是主執行緒:"+i);
}
//需要捕獲sleep()方法可能丟擲的異常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThread extends Thread{
public MyThread(String threadName) {
super(threadName);
System.out.println("開始呼叫start()方法");
start();
}
@Override
public void run() {
System.out.println("開始執行子執行緒的for迴圈");
try {
for(int i=1;i
sleep(500);//讓子執行緒睡眠0.5秒
System.out.println("大家好,我是子執行緒:"+i);
}
//需要捕獲sleep()方法可能丟擲的異常
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
建立一個子執行緒MtThread,在建構函式中呼叫start()方法啟動子執行緒,然後主執行緒也繼續執行,為了讓主執行緒最後結束,在這裡我讓子執行緒睡眠時間為0.5秒,主執行緒睡眠時間為1秒,這樣子總可以讓主執行緒最後結束。
執行結果:
開始呼叫start()方法
開始執行主執行緒的for迴圈
開始執行子執行緒的for迴圈
大家好,我是子執行緒:1
大家好,我是子執行緒:2
大家好,我是主執行緒:1
大家好,我是子執行緒:3
大家好,我是主執行緒:2
大家好,我是子執行緒:4
大家好,我是子執行緒:5
大家好,我是主執行緒:3
大家好,我是主執行緒:4
大家好,我是主執行緒:5
最後
到這裡,你一定很奇怪為什麼Java有兩種建立子執行緒的方法呢?哪一種更好呢?所有的問題都歸於一點,Thread類定義了多種方法可以被子類過載。對於所有的方法,唯一的必須重寫的是run()方法。而實現Runnable介面也只需要重寫run()方法。因此,如果你不過載Thread的其他方法,最好是實現Runnable介面。當然了,這得看個人習慣。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4798/viewspace-2802278/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【java多執行緒】(二)執行緒停止Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- java使用多執行緒Java執行緒
- Java多執行緒(二):Thread類Java執行緒thread
- Java多執行緒之二(Synchronized)Java執行緒synchronized
- Java多執行緒——synchronized的使用示例Java執行緒synchronized
- Java多執行緒-執行緒中止Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- 多執行緒(二)執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- Java多執行緒Thread類使用Java執行緒thread
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- java——多執行緒Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java 多執行緒Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒(二)volatile關鍵字Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java中的多執行緒Java執行緒
- java 多執行緒使用PipedOutStream和PipedInputStreamJava執行緒
- 深入理解多執行緒(二)—— Java的物件模型執行緒Java物件模型
- Android/java 多執行緒(二)-Thread的好兄弟HandlAndroidJava執行緒thread
- Java多執行緒(一)多執行緒入門篇Java執行緒
- java多執行緒5:執行緒間的通訊Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- Java多執行緒-鎖的區別與使用Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒