网站首页 > java教程 正文
进程: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;
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之类的也就没有什么优势了。。
猜你喜欢
- 2024-11-23 阿里P7大牛论:Kotlin协程优雅的与Retrofit缠绵
- 2024-11-23 Android技术分享|利用Kotlin协程,多任务并行,测试RTM SDK性能
- 2024-11-23 Go 的调度器是怎么实现协程中断的?远离手撕源码用 GIF 动图告诉你
- 2024-11-23 「协程」ViewModelScope源码解析
- 2024-11-23 使用协程优化你的业务
- 2024-11-23 爱奇艺网络协程编写高并发应用实践
- 2024-11-23 如何用 Netty 写一个高性能的分布式服务框架?
- 2024-11-23 进程、线程、线程池和协程如何理解?
- 2024-11-23 直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码
- 2024-11-23 Kotlin 协程一
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)