首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 多線程練習:10 線程分段求和 1-100 的優化方案與線程安全分析

     編輯:程式設計綜合問答

題目要求

10 個線程分別計算:1-10、11-20、...、91-100 的和,主線程匯總輸出總和 (5050)。

原代碼問題分析

  • 線程串行化:每啟動一個線程立即 join(),導致實際單線程執行
  • 共享變量非線程安全:times++ 無同步,多線程競爭導致結果錯誤
  • 設計過度複雜:繼承 Thread 而非實現 Runnable,耦合度高

優化方案一:ExecutorService + Future (推薦)

import java.util.concurrent.*;

public class SumCalculator {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        List> futures = new ArrayList<>();
        
        for (int i = 0; i < 10; i++) {
            final int start = i * 10 + 1;
            final int end = (i + 1) * 10;
            
            futures.add(executor.submit(() -> {
                int sum = 0;
                for (int j = start; j <= end; j++) sum += j;
                return sum;
            }));
        }
        
        int total = 0;
        for (Future f : futures) {
            total += f.get();  // 阻塞獲取結果
        }
        
        System.out.println("總和: " + total);  // 5050
        executor.shutdown();
    }
}

優化方案二:並行流 (Java 8+)

// 一行代碼實現並行求和
int total = IntStream.rangeClosed(1, 100)
                     .parallel()
                     .sum();
System.out.println(total);  // 5050

關鍵改進點對比

維度原代碼優化方案一並行流
並行度串行 (join)真並行 (線程池)自動並行
線程安全無同步無共享狀態框架保證
代碼量~50 行~25 行1 行
可維護性低高極高

線程安全深度解析

// ❌ 危險:times++ 非原子操作 (讀-改-寫)
static int times = 0;
// 線程 A: 讀取 times=5
// 線程 B: 讀取 times=5
// 線程 A: 寫入 6
// 線程 B: 寫入 6  (丟失一次更新)

// ✅ 方案:AtomicInteger
AtomicInteger times = new AtomicInteger(0);
times.incrementAndGet();  // 原子操作

// ✅ 方案:synchronized
synchronized(lock) { times++; }

// ✅ 方案:ThreadLocal + 最終匯總 (無競爭)

最佳實踐總結

  1. 使用 ExecutorService 管理線程生命周期
  2. 任務設計為無狀態、無共享,返回結果而非修改共享變量
  3. 用 Future.get() 收集結果,主線程匯總
  4. 簡單場景優先 parallelStream / IntStream.parallel
  5. 關閉線程池:executor.shutdown()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved