進程:process 線程:thread 協程:coroutine/feber 引子 最近在重新梳理知識體系,在比較編程語言的時候,發現現在流行的lua go rust kotlin之類都有 協程的概念,而JAVA在這塊是比較遲鈍的,而像go這類語言內置了協程,可以很容易寫出高性能的程序。 什么是”協程“ 眾所眾知,進程是OS用來分配資源的最小單位,線程是進行任務執行的最小單位,進程與線程都是OS級別的,兩者的運行都依賴于cpu的調度與資源分配,進程與線程都屬于內核態。而協程是在種輕量級別的線程,CPU根本不知道有協程的使用調度,它運行在用戶態,不需要與內核打交道,節省了OS級別的上下文切換 Java中的協程 其實java相比go rust等有點落后,沒有內置的協程概念,目前只能使用線程池,事件驅動等形式來支持高性能的程序,java目前有一些協程的類庫quasar,提供了纖程的使用,纖程其實就是協程。下面用quasar寫個例子來驗證一下纖程有多厲害吧。例子很簡單,啟動100萬個線程或者纖程,每個線程或纖程處理2kw次運算。
普通線程類 package com.fqh.review.base.fiber;
/**
- @author fqh
- @Description: java 線程例子
- @date 2020/7/28下午4:49 */ public class JavaThread {
/**
- 100w個線程,每個線程處理2千萬次運算
- @param argus
- @throws InterruptedException */ public static void main(String[] argus) throws InterruptedException { long begin = System.currentTimeMillis(); int threadLength=1000000;//100w Thread[] threads=new Thread[threadLength]; for (int i=0;i<threadLength;i++){ threads[i]=new Thread(()->{ calc(); }); }
for (int i=0;i<threadLength;i++){
threads[i].start();
}
for (int i=0;i<threadLength;i++){
threads[i].join();
}
System.out.println(System.currentTimeMillis()-begin);
}
//2kw次計算 static void calc(){ int result=0; for(int i=0;i<10000;i++){ for(int j=0;j<200;j++){ result+=i; } } }
}
- 纖程測試類 引入quasarJar
<dependency> <groupId>co.paralleluniverse</groupId> <artifactId>quasar-core</artifactId> <version>0.7.10</version> </dependency>
package com.fqh.review.base.fiber;
import co.paralleluniverse.fibers.Fiber; import java.util.concurrent.ExecutionException;
/**
- @author fqh
- @Description: java 纖程測試用例
- @date 2020/7/28下午4:48 / public class JavaFiber { /*100w個纖程,每個纖程處理2千萬次運算@param argus@throws InterruptedException */ public static void main(String[] argus) throws ExecutionException, InterruptedException { long begin = System.currentTimeMillis(); int fiberLength=1000000;//100w Fiber<Void>[] fibers=new Fiber[fiberLength]; for (int i=0;i<fiberLength;i++){ fibers[i]=new Fiber(()->{ calc(); }); }for (int i=0;i<fiberLength;i++){ fibers[i].start(); } for (int i=0;i<fiberLength;i++){ fibers[i].join(); } System.out.println(System.currentTimeMillis()-begin); }
//2kw次計算 static void calc(){ int result=0; for(int i=0;i<10000;i++){ for(int j=0;j<200;j++){ result+=i; } } } }
- 軟件環境: JDK8
- 機器配置:處理器名稱: Intel Core i7 處理器速度: 2.7 GHz 處理器數目: 1 核總數: 4 L2 緩存(每個核): 256 KB L3 緩存: 8 MB 內存: 16 GB
測試結果: 線程大概在50S左右,纖程在4S左右。。 ||
是不是被測試結果驚呆了。。只希望java能盡快把纖程進行內置。這樣go rust之類的也就沒有什么優勢了。。 進程:process 線程:thread 協程:coroutine/feber 引子 最近在重新梳理知識體系,在比較編程語言的時候,發現現在流行的lua go rust kotlin之類都有 協程的概念,而java在這塊是比較遲鈍的,而像go這類語言內置了協程,可以很容易寫出高性能的程序。 什么是”協程“ 眾所眾知,進程是OS用來分配資源的最小單位,線程是進行任務執行的最小單位,進程與線程都是OS級別的,兩者的運行都依賴于cpu的調度與資源分配,進程與線程都屬于內核態。而協程是在種輕量級別的線程,CPU根本不知道有協程的使用調度,它運行在用戶態,不需要與內核打交道,節省了OS級別的上下文切換 Java中的協程 其實java相比go rust等有點落后,沒有內置的協程概念,目前只能使用線程池,事件驅動等形式來支持高性能的程序,java目前有一些協程的類庫quasar,提供了纖程的使用,纖程其實就是協程。下面用quasar寫個例子來驗證一下纖程有多厲害吧。例子很簡單,啟動100萬個線程或者纖程,每個線程或纖程處理2kw次運算。
普通線程類 package com.fqh.review.base.fiber;
/**
- @author fqh
- @Description: java 線程例子
- @date 2020/7/28下午4:49 */ public class JavaThread {
/**
- 100w個線程,每個線程處理2千萬次運算
- @param argus
- @throws InterruptedException */ public static void main(String[] argus) throws InterruptedException { long begin = System.currentTimeMillis(); int threadLength=1000000;//100w Thread[] threads=new Thread[threadLength]; for (int i=0;i<threadLength;i++){ threads[i]=new Thread(()->{ calc(); }); }
for (int i=0;i<threadLength;i++){
threads[i].start();
}
for (int i=0;i<threadLength;i++){
threads[i].join();
}
System.out.println(System.currentTimeMillis()-begin);
}
//2kw次計算 static void calc(){ int result=0; for(int i=0;i<10000;i++){ for(int j=0;j<200;j++){ result+=i; } } }
}
- 纖程測試類 引入quasarJar
<dependency> <groupId>co.paralleluniverse</groupId> <artifactId>quasar-core</artifactId> <version>0.7.10</version> </dependency>
package com.fqh.review.base.fiber;
import co.paralleluniverse.fibers.Fiber; import java.util.concurrent.ExecutionException;
/**
- @author fqh
- @Description: java 纖程測試用例
- @date 2020/7/28下午4:48 / public class JavaFiber { /*100w個纖程,每個纖程處理2千萬次運算@param argus@throws InterruptedException */ public static void main(String[] argus) throws ExecutionException, InterruptedException { long begin = System.currentTimeMillis(); int fiberLength=1000000;//100w Fiber<Void>[] fibers=new Fiber[fiberLength]; for (int i=0;i<fiberLength;i++){ fibers[i]=new Fiber(()->{ calc(); }); }for (int i=0;i<fiberLength;i++){ fibers[i].start(); } for (int i=0;i<fiberLength;i++){ fibers[i].join(); } System.out.println(System.currentTimeMillis()-begin); }
//2kw次計算 static void calc(){ int result=0; for(int i=0;i<10000;i++){ for(int j=0;j<200;j++){ result+=i; } } } }
- 軟件環境: JDK8
- 機器配置:處理器名稱: Intel Core i7 處理器速度: 2.7 GHz 處理器數目: 1 核總數: 4 L2 緩存(每個核): 256 KB L3 緩存: 8 MB 內存: 16 GB
測試結果: 線程大概在50S左右,纖程在4S左右。。 ||
是不是被測試結果驚呆了。。只希望java能盡快把纖程進行內置。這樣go rust之類的也就沒有什么優勢了。。