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
