多執行緒實現的兩種方式及其區別
阿新 • • 發佈:2018-12-25
繼承Thread
public class Demo2_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start(); // 注意呼叫的start()方法,而不是run()方法
for(int i = 0; i < 1000; ++i)
System.out.println("222");
}
}
class MyThread extends Thread{ // 繼承Thread類
@Override
public void run() { // 重寫run方法
for(int i = 0; i < 1000; ++i) // 將將要執行的程式碼寫到run方法中
System.out.println("1111111111");
}
}
實現Runnable介面
public class Demo3_Thread {
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
for (int i = 0; i < 1000; ++i)
System.out.println("bb");
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
for(int i = 0; i < 1000; ++i)
System.out.println("aaaaaaaaaaaaaaaaa");
}
}
兩種方式的區別
檢視原始碼的區別:
1、繼承Thread:由於子類重寫父類的run(),當呼叫start()時,直接找子類的run()方法
2、實現Runnable介面:Thread的建構函式中傳入了Runnable引用,成員變數記住它,start()呼叫Thread中的run()方法時,判斷成員變數Runnable的引用是否為空,不為空則在Thread的run()方法中呼叫Runnable的run()方法。編譯看Runnable的run(),執行看子類run()方法。
繼承Thread:(首選這個,如果有了父類就用介面)
好處是:直接使用Thread類中的方法,程式碼簡單
弊端是:如果已經有了父類,就不能使用這種方法
實現Runnable介面:
好處是:即使自己定義的執行緒類有了父類也沒有關係,因為有了父類也可以實現介面,而介面是可以多實現的
弊端是:不能直接使用Thread類中的方法,需要先獲取到執行緒物件後,才能得到Thread的方法,程式碼複雜