Java 提供三種創建線程的標準方式:繼承 Thread、實現 Runnable、實現 Callable。本文通過完整代碼示例,對比三者異同與適用場景。
public class ThreadExtendsThread extends Thread {
private int i = 0;
@Override
public void run() {
for (; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
}
// 使用方式
ThreadExtendsThread t = new ThreadExtendsThread();
t.start();
特點:線程對象即任務對象,簡單但無法繼承其他類,任務與線程控制耦合。
public class ThreadImplementsRunnable implements Runnable {
private int i = 0;
@Override
public void run() {
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
// 使用方式
Runnable task = new ThreadImplementsRunnable();
new Thread(task).start();
new Thread(task).start(); // 同一任務可被多線程共享
優勢:
import java.util.concurrent.Callable; public class ThreadImplementsCallable implements Callable{ private int i = 0; @Override public Integer call() throws Exception { for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } return i; // 有返回值 } } // 使用方式 Callable callable = new ThreadImplementsCallable(); FutureTask futureTask = new FutureTask<>(callable); new Thread(futureTask).start(); new Thread(futureTask).start(); try { Integer result = futureTask.get(); // 獲取返回值,阻塞直到完成 System.out.println("返回值: " + result); } catch (Exception e) { e.printStackTrace(); }
核心優勢:
call() 拋出 Exception| 維度 | 繼承 Thread | 實現 Runnable | 實現 Callable |
|---|---|---|---|
| 返回值 | 無 | 無 | ✅ 有 (泛型) |
| 拋出異常 | 無 | 無 | ✅ 可拋出 |
| 任務復用 | 不可 | ✅ 可共享 | ✅ 可共享 |
| 繼承限制 | 單繼承 | 無 | 無 |
| 適用場景 | 簡單獨立任務 | 通用任務、線程池 | 需返回值/異常的異步計算 |
ExecutorService) 使用,資源可控Future 進行異步編排() -> { ... } 簡化 Runnable/Callable 創建