方式一:成為Thread的子類,然后在Thread的子類.start
缺點:存在耦合度(因為線程任務run方法里面的業務邏輯 和 線程啟動耦合了)
缺點:Cat extends Thread {} 后無法在繼承其他的類了
注意:⚠️ Cat一旦繼承Thread,Cat就屬於線程對象
示例:
package android.java.thread04; /** * 定義線程的第一種方式 成為Thread的子類 */ class Cat extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 10; i++) { System.out.println("第 " + (i + 1) + " 次喵🐱"); } } } public class ThreadTest { public static void main(String[] args) { // 第一種方式 然后在Thread的子類.start new Cat().start(); } }
執行的結果日志打印:
方式二:成為Runnable的實現類 由於Thread類可以指定執行Runnable接口實現類,所以把Runnable實現類傳遞給Thread類,Thread類.start
優點:第一種方式存在耦合度,第二種方式就解耦了,因為線程任務run方法里面的業務邏輯 和 線程啟動分離了)
Runnable實現類
new Thread().start();
new Thread(傳遞Runnable實現類).start();
優點:Cat implements Runnable {} 后 還可以繼承其他的類了
注意:⚠️ Cat一旦實現了Runnable接口,Cat只屬於Runnable實現類,不屬於線程,千萬不要以為此Cat是線程,不過此Cat可以被Thread去執行任務
注意 Thread才是線程
示例:
package android.java.thread05; /** * 定義線程的第二種方式 成為Runnable的實現類 */ class Cat implements Runnable { @Override public void run() { for (int i = 0; i < 8; i++) { System.out.println("第 " + (i + 1) + " 次喵🐱"); } } } public class ThreadTest { public static void main(String[] args) { // 第二種方式 由於Thread類可以指定執行Runnable接口實現類,所以把Runnable實現類傳遞給Thread類,Thread類.start // new Thread(傳遞Runnable實現類).start(); new Thread(new Cat()).start(); } }
執行的結果打印: