目录
1.协程的切换者是用户(编程者或应用程序),切换时机是用户自己的程序所决定的。协程的切换内容是硬件上下文,切换内存保存在用户自己的变量(用户栈或堆)中。协程的切换过程只有用户态,即没有陷入内核态,因此切换效率高。
2.目前现状
3.代码测试 协程 vs线程 效率
线程:
协程:
debug协程线程什么情况
总结:
1.协程的切换者是用户(编程者或应用程序),切换时机是用户自己的程序所决定的。协程的切换内容是硬件上下文,切换内存保存在用户自己的变量(用户栈或堆)中。协程的切换过程只有用户态,即没有陷入内核态,因此切换效率高。
2.目前现状
目前jdk官方还没给出协程库,网址是 https://openjdk.java.net/projects/loom/
我们可以参考下 这个项目的主导者在github上的 quasar ,相当于第三方的协程库
https://github.com/puniverse/quasar
3.代码测试 协程 vs线程 效率
(本人电脑配置)
线程:
package com.yk.jdk.thread;
public class ThreadTest {
static int LENGTH=100000;
public static void main(String[] args) throws InterruptedException {
Long start=System.currentTimeMillis();
Thread[] threads=new Thread[LENGTH];
for(int i=0;i<LENGTH;i++){
threads[i]=new Thread(()->{
cale();
});
}
for(int i=0;i<LENGTH;i++){
threads[i].start();
}
for(int i=0;i<LENGTH;i++){
threads[i].join();
}
Long end=System.currentTimeMillis();
System.out.println("ThreadTest cost======================="+(end-start));
}
private static void cale() {
int k=0;
for(int i=0;i<1000;i++){
for (int j=0;j<200;j++){
k+=i;
}
}
}
}
线程 10000 ,计算200万次 耗时 1279毫秒
线程 100000 ,计算200万次 耗时 6892毫秒
协程:
package com.yk.jdk.thread;
import co.paralleluniverse.fibers.Fiber;
import java.util.concurrent.ExecutionException;
public class FiberTest {
static int LENGTH=100000;
public static void main(String[] args) throws InterruptedException, ExecutionException {
Long start=System.currentTimeMillis();
Fiber[] fibers=new Fiber[LENGTH];
for(int i=0;i<LENGTH;i++){
fibers[i]=new Fiber(()->{
cale();
});
}
for(int i=0;i<LENGTH;i++){
fibers[i].start();
}
for(int i=0;i<LENGTH;i++){
fibers[i].join();
}
Long end=System.currentTimeMillis();
System.out.println("FiberTest cost======================="+(end-start));
}
private static void cale() {
int k=0;
for(int i=0;i<1000;i++){
for (int j=0;j<200;j++){
k+=i;
}
}
}
}
需要配置 java 参数 javaagent ,-javaagent:path-quasar.jar (需要改成本地的位置)
协程10000,计算200万次,耗时 604毫秒
协程 100000 ,计算200万次 耗时 975毫秒
debug协程线程什么情况
?
可以看到 协程 100000时候,才创建了4个线程,所以相对于线程肯定有大大的提升。
总结:
1.当数据量不大的时候,协程跟线程,协程大概花费时间是线程的一半。
2.当数据量比较大的时候,协程效率大大高于线程,数据越大 效果越明显。
|