Java 繼承Thread類和實現Runnable介面的區別
阿新 • • 發佈:2018-12-17
java中執行緒的建立有兩種方式
1. 通過繼承Thread類,重寫Thread的run()方法,將執行緒執行的邏輯放在其中;
2. 通過實現Runnable介面,例項化Thread類;
繼承Thread類:
public class TestThreadDemo extends Thread {
int num = 3;
public TestThreadDemo(String ThreadName) {
super(ThreadName);
}
@Override
public void run() {
for (int i = 0; i < 10; i++)
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "--->" + num--);
}
}
public static void main(String[] args) {
new TestThreadDemo("執行緒一").start();
new TestThreadDemo("執行緒二").start();
new TestThreadDemo("執行緒三").start();
}
}
輸出的結果:
通過實現Runnable介面
public class TestRunnable implements Runnable {
int num = 3;
public TestRunnable() {
}
@Override
public void run() {
for (int i = 0; i < 10; i++)
if (num > 0) {
System.out.println(Thread.currentThread().getName() + "--->" + num--);
}
}
public static void main(String[] args) {
TestRunnable tr = new TestRunnable();
new Thread(tr, "執行緒一").start();
new Thread(tr, "執行緒二").start();
new Thread(tr, "執行緒三").start();
}
}
輸出的結果:
我們會發現兩種實現執行緒的方式輸出的結果不同,為什麼會出現這種情況呢?我們可以這樣思考一下:new TestThreadDemo()建立了三個物件時同時建立了三個執行緒,每個執行緒都有一個run()方法執行任務;第二種方法是三個執行緒共同的執行一個run()方法去執行任務,至於我輸出的都是執行緒一,這個話可能是在搶CPU資源時,被執行緒一搶到了。至於執行緒二和執行緒三在執行的過程中,沒有搶到資源。
在我們剛接觸的時候可能會迷糊繼承Thread類和實現Runnable介面實現多執行緒,其實在接觸後我們會發現這完全是兩個不同的實現多執行緒,一個是多個執行緒分別完成自己的任務,一個是多個執行緒共同完成一個任務。
其實在實現一個任務用多個執行緒來做也可以用繼承Thread類來實現只是比較麻煩,一般我們用實現Runnable介面來實現,簡潔明瞭。
大多數情況下,如果只想重寫 run() 方法,而不重寫其他 Thread 方法,那麼應使用 Runnable 介面。這很重要,因為除非程式設計師打算修改或增強類的基本行為,否則不應為該類(Thread)建立子類。