同步調用中,數據通過方法參數傳入,通過返回值帶出。多線程異步模型下,線程啟動與數據準備在時間上分離,無法直接使用參數/返回值,必須採用共享內存或回調機制。
public class ConstructorThread extends Thread {
private final String taskName; // final 保證可見性
private final Config config; // 不可變配置對象
public ConstructorThread(String taskName, Config config) {
this.taskName = taskName;
this.config = config;
}
@Override
public void run() {
// 直接使用 taskName, config
process(taskName, config);
}
}
// 使用
new ConstructorThread("Task-1", config).start();
優點:線程啟動前數據已就緒,無競態;缺點:參數多時構造器膨脹,需重載或使用 Builder 模式。
public class SetterThread implements Runnable {
private String taskName;
private Config config;
public void setTaskName(String taskName) { this.taskName = taskName; }
public void setConfig(Config config) { this.config = config; }
@Override
public void run() {
// 使用注入的數據
}
}
// 使用
SetterThread runner = new SetterThread();
runner.setTaskName("Task-2");
runner.setConfig(config);
new Thread(runner).start();
優點:解決構造器參數過多問題,支援分步初始化;缺點:必須在 start() 前完成注入,否則可能見到舊值(需 volatile 或鎖保證可見性)。
// 回調接口
interface DataProcessor {
void process(ResultContainer container, int... numbers);
}
// 線程類
public class CallbackThread extends Thread {
private final DataProcessor processor;
public CallbackThread(DataProcessor processor) {
this.processor = processor;
}
@Override
public void run() {
// 運行時生成數據
int n1 = random(), n2 = random(), n3 = random();
ResultContainer result = new ResultContainer();
// 回調:將數據「推」給外部處理器
processor.process(result, n1, n2, n3);
System.out.println(n1 + "+" + n2 + "+" + n3 + "=" + result.value);
}
}
// 使用:匿名內部類 / Lambda 實現回調
new CallbackThread((container, a, b, c) -> {
container.value = a + b + c; // 業務邏輯在外部定義
}).start();
本質:控制反轉 (IoC)。線程不關心具體處理邏輯,只負責在恰當時機觸發回調。這正是觀察者模式/事件驅動的雛形。
| 維度 | 構造器注入 | Setter 注入 | 回調注入 |
|---|---|---|---|
| 數據確定時機 | 線程創建前 | start() 前 | 運行時動態 |
| 線程安全要求 | 無 (final) | 需 volatile/同步 | 回調實現方負責 |
| 適用場景 | 固定配置、不可變上下文 | 可選參數、運行前動態決定 | 需外部服務參與、結果異步通知 |
| 耦合度 | 低 | 低 | 中 (依賴接口) |
final 字段,從根源消除可見性問題BlockingQueue、CompletableFuture、Disruptor 等高級併發組件替代手工共享內存「欲先取之,必先予之」。向線程傳遞數據的核心是在線程啟動前(構造器/Setter)或線程運行中(回調)建立安全的發布機制。掌握三種方式的適用邊界,是編寫正確、可維護並發代碼的基石。