The difference beteen two way
總所周知,Java實現(xiàn)多線程有兩種方式,分別是繼承Thread類和實現(xiàn)Runable接口,那么它們的區(qū)別是什么?
繼承 Thread 類:
通過繼承 Thread 類,你可以創(chuàng)建一個直接表示線程的類。你可以覆蓋 Thread 類中的 run 方法來定義線程的邏輯。當調(diào)用 start 方法啟動線程時,會執(zhí)行該類中的 run 方法。
優(yōu)點:簡單直觀,可以直接訪問線程的方法和屬性。
缺點:由于 Java 不支持多重繼承,因此如果你的類已經(jīng)繼承了其他類,就無法再繼承 Thread 類。此外,由于繼承是一種靜態(tài)的方式,它限制了類的擴展性。
實現(xiàn) Runnable 接口:
通過實現(xiàn) Runnable 接口,你可以將線程的邏輯封裝在一個獨立的類中。這個類只需要實現(xiàn) Runnable 接口中的 run 方法。然后,你可以將該類的實例傳遞給 Thread 對象,并調(diào)用 start 方法啟動線程。
優(yōu)點:避免了單繼承的限制,提高了代碼的靈活性和可維護性。可以在多個類中共享同一個線程對象。
缺點:在訪問線程的方法和屬性時需要通過 Thread 對象來間接訪問。
總結(jié):
還是實現(xiàn) Runnable 比較好,代碼比較靈活,避免了單繼承的局限性,最重要的是可以在多個類中共享線程對象。
Method receiving parameters within a thread
Defind a Sub Thread
public class MyRunnable implements Runnable {
private String parameter;
public MyRunnable(String parameter) {
this.parameter = parameter;
}
@Override
public void run() {
// 在這里編寫子線程的邏輯,可以使用參數(shù) parameter
System.out.println("子線程執(zhí)行,參數(shù)為:" + parameter);
}
}
Main Thread to call Sub Thread
// 在主線程中創(chuàng)建并啟動子線程
public class MainThread {
public static void main(String[] args) {
String parameter = "Hello, World!";
Thread thread = new Thread(new MyRunnable(parameter));
thread.start();
// 主線程繼續(xù)執(zhí)行其他操作
System.out.println("主線程繼續(xù)執(zhí)行");
}
}
在上面的示例中,我們定義了一個實現(xiàn)了 Runnable 接口的類 MyRunnable。該類的構(gòu)造函數(shù)接收一個參數(shù),并將其保存在成員變量 parameter 中。在 run 方法中,我們可以使用該參數(shù)執(zhí)行子線程的邏輯。
然后,在主線程中,我們創(chuàng)建了一個子線程,并將 MyRunnable 對象作為參數(shù)傳遞給 Thread 構(gòu)造函數(shù)。通過調(diào)用 start 方法來啟動子線程。
Method return parameters within a thread
在 Java 中,Runnable 接口本身并不支持直接返回值。它的 run 方法沒有定義返回值。然而,你可以通過get方式來實現(xiàn)在 Runnable 實例中獲取返回值的效果。
下面是一個示例,展示了如何通過自定義類來實現(xiàn)在 Runnable 接口中獲取返回值的功能:
public class MyRunnable implements Runnable {
private int result;
public int getResult() {
return result;
}
@Override
public void run() {
// 執(zhí)行耗時操作,計算結(jié)果
result = performCalculation();
}
private int performCalculation() {
// 在這里執(zhí)行具體的計算邏輯
// ...
return 42; // 假設計算結(jié)果為 42
}
}
main
public class MainThread {
public static void main(String[] args) {
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
// 等待子線程執(zhí)行完成
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取子線程的返回值
int result = runnable.getResult();
System.out.println("子線程的返回值為: " + result);
}
}
在上述示例中,MyRunnable 類實現(xiàn)了 Runnable 接口,并在其內(nèi)部定義了一個 result 變量用于保存計算結(jié)果。在 run 方法中,你可以執(zhí)行耗時的計算操作,并將結(jié)果賦值給 result 變量。
在主線程中,我們創(chuàng)建了一個 MyRunnable 實例,并將其傳遞給 Thread 構(gòu)造函數(shù)。通過調(diào)用 start 方法啟動線程后,我們使用 join 方法等待子線程執(zhí)行完成。
最后,我們通過調(diào)用 getResult 方法獲取子線程的計算結(jié)果,并打印輸出。文章來源:http://www.zghlxwxcb.cn/news/detail-677083.html
請注意,這種方式是通過自定義類來實現(xiàn)從子線程中獲取返回值的效果,并不是直接使用 Runnable 接口本身的特性。文章來源地址http://www.zghlxwxcb.cn/news/detail-677083.html
到了這里,關(guān)于線程方法接收參數(shù)示例,Java的兩種線程實現(xiàn)方式區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!