Java 8 並發編程


Java 1.5前

並發實現

  • Java Green Thread

java 1.2 前的線程受os內核限制, 線程=進程, 綠色線程是JVM調度, 用來模擬多線程環境. 不需要本地線程支持.

  • Java Native Thread

對比
綠色線程在線程激活和線程同步方面優於本地線程
在I/O和上下文操作方面性能要低於本地線程

編程模型

  • Thread
  • Runnable

局限性(后續版本將解決完善這部分缺陷, 可對比學習)

  • 缺少線程管理的原生支持(缺少線程池)
  • 缺少"鎖"API(只有 synchronized 關鍵字)
  • 缺少執行完成的原生支持

變通的實現方式:


public static void main(String[] args){
    CompletableRunnable runnable = new CompletableRunnable();
    Thread thread = new Thread(runnable,"Sub");
    thread.start();
    thread.join(); //此處阻塞主線程等待Sub完成, 否則得到的結果不准確
    System.out.printf("[Thread: %s] is running\n", Thread.currentThread.getName());
    System.out.printf("Sub Thread is completed, result is %s\n", runnable.getCompleted());
}

private static class CompletableRunnable implements Runnable{
    private volatile boolean completed = false;

    @Override
    public void run(){
        System.out.printf("[Thread: %s] is running\n", Thread.currentThread.getName());

        completed = true;
    }

    public boolean getCompleted(){
        return completed;
    }
}
  • 執行結果獲取困難
  • Double Check Locking 不確定性 (單例模式)

Java 5

並發框架

  • J.U.C

編程模型

  • Executor, Execurtors, ExecutorService 等
  • Runnable , Callable
  • Future

Java 7

並行框架

  • Fork/Join

編程模型

  • ForkJoinPool
  • ForkJoinTask
  • RecursiveAction

Future (Java 5 引入) 限制

  • 無法手工完成
  • 阻塞式結果返回
  • 無法鏈式多個Future
  • 無法合並多個Future的結果
  • 缺少異常處理

Java 8

異步並行框架

  • Fork/Join

編程模型

  • CompletionStage
  • CompletableFuture

其他框架

  • Spring 和 Guava 使用不同的 ListenableFuture


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM