在Java裏體驗一把協程Quasar

在還沒有協程的時代

操作系統產生一個進程,進程再產生若干個線程並行的處理邏輯,線程的切換由操作系統負責調度。每個線程都有自己的棧

所以指望一個進程開啓上萬個線程是不現實的。但是實際上我們也不會這麼幹,因爲起這麼多線程並不能充分的利用CPU,大部分線程處於等待狀態,CPU也沒有這麼核讓線程使用。所以一般線程數目都是CPU的核數。

傳統的J2EE系統都是基於每個請求佔用一個線程去完成完整的業務邏輯(包括事務)。所以系統的吞吐能力取決於每個線程的操作耗時。如果遇到很耗時的I/O行爲,則整個系統的吞吐立刻下降,比如JDBC是同步阻塞的,這也是爲什麼很多人都說數據庫是瓶頸的原因。這裏的耗時其實是讓CPU一直在等待I/O返回,說白了線程根本沒有利用CPU去做運算,而是處於空轉狀態。暴殄天物啊。另外過多的線程,也會帶來更多的ContextSwitch開銷。

點評:JDK中有了線程,允許一定的併發處理,而且有封裝很好的ThreadPool,可以用來管理大量的線程生命週期,但是本質上還是不能很好的解決線程數量的問題,以及線程空轉佔用CPU資源的問題。

爲了解決同步阻塞時線程空轉佔用CPU資源的問題,行業早期流行的解決方案之一就是單線程加上異步回調。遇到需要進行I/O操作的地方,就直接讓出CPU資源,然後註冊一個回調函數,其他邏輯則繼續往下走,I/O結束後帶着結果向事件隊列裏插入執行結果,然後由事件調度器調度回調函數,傳入結果。

點評:爲了保存之前的棧上數據,你要麼選擇帶着一起放入回調函數裏,要麼就不停的嵌套,從而引起反人類的Callback hell。而且業務邏輯上也有一定的割裂

協程應運而生

目前JDK原生是不支持協程的,一直被go工程師鄙視,Java工程師苦協程久已,大師puniverse看不下去了,基於字節碼技術搞了一個Quasar來支持協程,目前一直在更新維護

基於Quasar的第一個協程示例

1.添加pom依賴
    
co.paralleluniverse
quasar-core
0.7.9
jdk8

2.測試代碼
public static void main(String[] args) throws Exception {
//使用阻塞隊列來獲取結果。
LinkedBlockingQueue<Fiber> fiberQueue = new LinkedBlockingQueue<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);
for (int i = 0; i < 100; i++) {
int finalI = i;
//這裏的Fiber有點像Callable,可以返回數據
Fiber fiber = new Fiber<>((SuspendableCallable) () -> {
//這裏用於測試內存佔用量
Fiber.sleep(1000);
System.out.println(“in-” + finalI + “-” + LocalDateTime.now().format(formatter));
return finalI;
});
//開始執行
fiber.start();
//加入隊列
fiberQueue.add(fiber);
}
while (true) {
//阻塞
Fiber fiber = fiberQueue.take();
System.out.println(“out-” + fiber.get() + “-” + LocalDateTime.now().format(formatter));
}
}

3.測試運行
啓動時需要指定javaagent -javaagent:${ $path/quasar-core.jar} ,其它的跟普通java程序沒啥區別

運行日誌
ForkJoinPool-default-fiber-pool-worker-1-in-0-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-4-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-3-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-1-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-6-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-2-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-9-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-12-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-13-2019-09-19 19:23:19
main-out-0-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-5-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-7-2019-09-19 19:23:19
main-out-1-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-17-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-18-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-16-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-15-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-21-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-14-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-22-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-24-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-8-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-10-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-26-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-11-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-28-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-29-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-30-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-27-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-32-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-34-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-35-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-25-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-37-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-36-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-23-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-19-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-20-2019-09-19 19:23:19
main-out-2-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-42-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-41-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-40-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-45-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-39-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-38-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-33-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-31-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-49-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-48-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-47-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-46-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-54-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-56-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-57-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-58-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-59-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-60-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-61-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-44-2019-09-19 19:23:19
main-out-3-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-43-2019-09-19 19:23:19
main-out-4-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-63-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-62-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-55-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-53-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-52-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-51-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-69-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-50-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-70-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-67-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-73-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-68-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-74-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-75-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-65-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-77-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-66-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-79-2019-09-19 19:23:19
main-out-5-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-80-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-64-2019-09-19 19:23:19
main-out-6-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-81-2019-09-19 19:23:19
main-out-7-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-82-2019-09-19 19:23:19
main-out-8-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-78-2019-09-19 19:23:19
main-out-9-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-76-2019-09-19 19:23:19
main-out-10-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-72-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-71-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-88-2019-09-19 19:23:19
main-out-11-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-87-2019-09-19 19:23:19
main-out-12-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-86-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-85-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-84-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-93-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-83-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-95-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-96-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-0-in-98-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-2-in-94-2019-09-19 19:23:19
main-out-13-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-7-in-92-2019-09-19 19:23:19
main-out-14-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-5-in-91-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-3-in-90-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-1-in-89-2019-09-19 19:23:19
main-out-15-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-6-in-99-2019-09-19 19:23:19
ForkJoinPool-default-fiber-pool-worker-4-in-97-2019-09-19 19:23:19
main-out-16-2019-09-19 19:23:19
main-out-17-2019-09-19 19:23:19
main-out-18-2019-09-19 19:23:19
main-out-19-2019-09-19 19:23:19
main-out-20-2019-09-19 19:23:19
main-out-21-2019-09-19 19:23:19
main-out-22-2019-09-19 19:23:19
main-out-23-2019-09-19 19:23:19
main-out-24-2019-09-19 19:23:19
main-out-25-2019-09-19 19:23:19
main-out-26-2019-09-19 19:23:19
main-out-27-2019-09-19 19:23:19
main-out-28-2019-09-19 19:23:19
main-out-29-2019-09-19 19:23:19
main-out-30-2019-09-19 19:23:19
main-out-31-2019-09-19 19:23:19
main-out-32-2019-09-19 19:23:19
main-out-33-2019-09-19 19:23:19
main-out-34-2019-09-19 19:23:19
main-out-35-2019-09-19 19:23:19
main-out-36-2019-09-19 19:23:19
main-out-37-2019-09-19 19:23:19
main-out-38-2019-09-19 19:23:19
main-out-39-2019-09-19 19:23:19
main-out-40-2019-09-19 19:23:19
main-out-41-2019-09-19 19:23:19
main-out-42-2019-09-19 19:23:19
main-out-43-2019-09-19 19:23:19
main-out-44-2019-09-19 19:23:19
main-out-45-2019-09-19 19:23:19
main-out-46-2019-09-19 19:23:19
main-out-47-2019-09-19 19:23:19
main-out-48-2019-09-19 19:23:19
main-out-49-2019-09-19 19:23:19
main-out-50-2019-09-19 19:23:19
main-out-51-2019-09-19 19:23:19
main-out-52-2019-09-19 19:23:19
main-out-53-2019-09-19 19:23:19
main-out-54-2019-09-19 19:23:19
main-out-55-2019-09-19 19:23:19
main-out-56-2019-09-19 19:23:19
main-out-57-2019-09-19 19:23:19
main-out-58-2019-09-19 19:23:19
main-out-59-2019-09-19 19:23:19
main-out-60-2019-09-19 19:23:19
main-out-61-2019-09-19 19:23:19
main-out-62-2019-09-19 19:23:19
main-out-63-2019-09-19 19:23:19
main-out-64-2019-09-19 19:23:19
main-out-65-2019-09-19 19:23:19
main-out-66-2019-09-19 19:23:19
main-out-67-2019-09-19 19:23:19
main-out-68-2019-09-19 19:23:19
main-out-69-2019-09-19 19:23:19
main-out-70-2019-09-19 19:23:19
main-out-71-2019-09-19 19:23:19
main-out-72-2019-09-19 19:23:19
main-out-73-2019-09-19 19:23:19
main-out-74-2019-09-19 19:23:19
main-out-75-2019-09-19 19:23:19
main-out-76-2019-09-19 19:23:19
main-out-77-2019-09-19 19:23:19
main-out-78-2019-09-19 19:23:19
main-out-79-2019-09-19 19:23:19
main-out-80-2019-09-19 19:23:19
main-out-81-2019-09-19 19:23:19
main-out-82-2019-09-19 19:23:19
main-out-83-2019-09-19 19:23:19
main-out-84-2019-09-19 19:23:19
main-out-85-2019-09-19 19:23:19
main-out-86-2019-09-19 19:23:19
main-out-87-2019-09-19 19:23:19
main-out-88-2019-09-19 19:23:19
main-out-89-2019-09-19 19:23:19
main-out-90-2019-09-19 19:23:19
main-out-91-2019-09-19 19:23:19
main-out-92-2019-09-19 19:23:19
main-out-93-2019-09-19 19:23:19
main-out-94-2019-09-19 19:23:19
main-out-95-2019-09-19 19:23:19
main-out-96-2019-09-19 19:23:19
main-out-97-2019-09-19 19:23:19
main-out-98-2019-09-19 19:23:19
main-out-99-2019-09-19 19:23:19

Quasar原理剖析

https://blog.csdn.net/guzhangyu12345/article/details/84666423
https://segmentfault.com/a/1190000006079389

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章