首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程實現的三種核心方式詳解與代碼實戰

     編輯:Java 相關知識

前言

Java 提供三種創建線程的標準方式:繼承 Thread、實現 Runnable、實現 Callable。本文通過完整代碼示例,對比三者異同與適用場景。

方式一:繼承 Thread 類

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();

特點:線程對象即任務對象,簡單但無法繼承其他類,任務與線程控制耦合。

方式二:實現 Runnable 接口

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(); // 同一任務可被多線程共享

優勢:

  • 任務與線程分離,支持同一任務多線程並發
  • 避免單繼承限制
  • 實例變量可在線程間共享

方式三:實現 Callable 接口 (Java 5+)

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
  • 配合 Future/FutureTask:支持異步計算、結果獲取、取消、超時控制

三方式對比總結

維度繼承 Thread實現 Runnable實現 Callable
返回值無無✅ 有 (泛型)
拋出異常無無✅ 可拋出
任務復用不可✅ 可共享✅ 可共享
繼承限制單繼承無無
適用場景簡單獨立任務通用任務、線程池需返回值/異常的異步計算

生產建議

  • 優先選擇 Runnable:配合線程池 (ExecutorService) 使用,資源可控
  • 需要結果時用 Callable:配合 Future 進行異步編排
  • 避免直接繼承 Thread:靈活性差,難以整合線程池
  • Java 8+ 推薦 Lambda:() -> { ... } 簡化 Runnable/Callable 創建
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved