1.java的协程_虚拟线程

article/2025/11/6 8:34:54

盼过了春天盼秋天,从2017年到今天五年了,终于盼到loom转正了,当看到jdk19预览api的时候心情那个激动。。。期待已久的协程终于来临,再也不羡慕别人家的go孩子,咱终于可以理直气壮的说一句:咱也有,怕啥?
在这里插入图片描述
之前研究并发着实羡慕了一把go的线程,因为本身是游戏开发出身,使用的reactor模式也不吃协程的红利,疯狂压榨机器性能才是追求的目标,这点上线程密集的顺序调度性能是协程比不上的,因为协程在管理和调度上的开销,导致性能损耗,游戏其实也更适合CPU密集型计算,但是问题是游戏也不是一座孤岛,还有网关服,账号服,充值服,gm管理服,http服(游戏附带的一些数据请求)等的存在,举个例子:一个登陆请求来了,先去账号获取登陆信息,账号又得去平台中心的账号验证,期间还得去一趟网关服拉取服务器信息,验证完整后还得去redis刷新一波,这一套操作下来,线程等待的开销着实吃不消,能提供的并发访问数也很有限,这个时候突然想起了隔壁go的协程,真的是各种羡慕嫉妒恨,用协程写起来不用考虑性能问题真是的想咋写咋写,我单手写,倒立写,跳起来写。。。可惜我大java没有。。。只能靠着保存堆栈的上下文信息避开死亡回调,写起来也是束手束脚,远没有go同步写法来的过瘾。整日郁郁寡欢的我突然刷到JDK19的到来并带来了重磅级发布:虚拟线程。这下,是真的舒服了。。。

破母鸡带的想要尝试一把,先来个启动:

    /**** @desc 主线程*******************************************/public static void main(String[] args){System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");for (int i : calcNum)testThread(i);for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {long count = gc.getCollectionCount();long time = gc.getCollectionTime();String name = gc.getName();System.out.println(String.format("%s: %s times %s ms", name, count, time));}}private static void testThread(int count){AtomicInteger i = new AtomicInteger(count);Thread mainThread = Thread.currentThread();startDate.set(System.currentTimeMillis());for(int j = 0; j< count; j++) {Thread.startVirtualThread(()->{try {Thread.sleep(100l);} catch (InterruptedException e) {throw new RuntimeException(e);}if(i.getAndDecrement() == 1) {System.out.println("threadNum:"+ count+",perDate:" + (System.currentTimeMillis() - startDate.get())+" ms");LockSupport.unpark(mainThread);}});}LockSupport.park();}

执行的时候得加上:–source 19 --enable-preview

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
threadNum:1000,perDate:131 ms
threadNum:10000,perDate:151 ms
threadNum:50000,perDate:173 ms
threadNum:100000,perDate:229 ms
threadNum:200000,perDate:405 ms
threadNum:500000,perDate:1458 ms
threadNum:1000000,perDate:2241 ms
G1 Young Generation: 0 times 0 ms
G1 Old Generation: 0 times 0 ms

100W线程一顿操作,心里那叫一个舒坦,用线程的情况下1000个就开始叫苦不迭,现在轻轻松松百万级,也不用再走线程的内核态进行线程切换,终于可以扬眉吐气了,抬头挺胸把人做。现在开始就静静的等待预览API快些转到常规API。。。后续会放出java和go的协程对比。今天先到这里了,下章见。


http://chatgpt.dhexx.cn/article/vEfmZwOM.shtml

相关文章

Kotlin协程到底是怎么切换线程的?你是否知晓?

好文推荐&#xff1a; 作者&#xff1a;RicardoMJiang 前言 之前对协程做了一个简单的介绍&#xff0c;回答了协程到底是什么的问题,感兴趣的同学可以了解下&#xff1a;【带着问题学】协程到底是什么? 通过上文&#xff0c;我们了解了以下内容 1.kotlin协程本质上对线程池的…

进程和线程、协程的区别

一、进程 进程是程序一次动态执行的过程&#xff0c;是程序运行的基本单位。每个进程都有自己的独立内存空间&#xff0c;不同进程通过进程间通信来通信。进程占据独立的内存&#xff0c;所以上下文进程间的切换开销&#xff08;栈、寄存器、页表、文件句柄等&#xff09;比较…

进程、线程与协程的比较

进程、线程和协程是三个在多任务处理中常听到的概念&#xff0c;三者各有区别又相互联系。 一、并行和并发 在介绍进程、线程和协程这三个概念之前&#xff0c;有两个操作系统中的相关概念需要简单解释一下&#xff1a;并行和并发。 并行&#xff1a;指多个任务同时执行。 并…

进程、线程、协程

进程、线程、协程 一、概念与区分 1、进程 进程是程序一次动态执行的过程&#xff0c;是程序运行的基本单位。每个进程都有自己的独立内存空间&#xff0c;不同进程通过进程间通信来通信。进程占据独立的内存&#xff0c;所以上下文进程间的切换开销&#xff08;栈、寄存器、…

终于明白:有了线程,为什么还要有协程?

并发的发展历史 其实&#xff0c;在早期计算机并没有包含操作系统&#xff0c;这个时候&#xff0c;这个计算机只跑一个程序&#xff0c;这个程序独享计算机的所有资源&#xff0c;这个时候不存在什么并发问题&#xff0c;但是对计算机的资源来说&#xff0c;确实是一种浪费。…

Java中的多线程(线程间通信)

/学习笔记/ 线程间通信&#xff1a; 多个线程在处理同一资源&#xff0c;但是任务却不同。 先看一个例子&#xff0c;采用两个线程执行进行输入和输出任务&#xff1a; //资源class Resource{String name;String sex;}//输入class Input implements Runnable{Resource r ;// …

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

文章目录 什么是协程协程的优点与缺点协程实现原理.协程与线程在不同编程语言的实现在Java中使用协程Kilim介绍Kilim整合Java,使用举例 小总结 什么是协程 相对于协程&#xff0c;你可能对进程和线程更为熟悉。进程一般代表一个应用服务&#xff0c;在一个应用服务中可以创建多…

进程、线程和协程之间的区别和联系

文章目录 一、进程二、线程三、进程和线程的区别与联系四、一个形象的例子解释进程和线程的区别五、进程/线程之间的亲缘性六、协程 一、进程 进程&#xff0c;直观点说&#xff0c;保存在硬盘上的程序运行以后&#xff0c;会在内存空间里形成一个独立的内存体&#xff0c;这个…

简单了解线程和协程(C#)

1.为什么需要线程和协程&#xff1a; &#xff08;1&#xff09;使程序中的任务可以并发执行&#xff0c;让程序同时处理多个任务&#xff0c;提高程序的运行效率和响应速度 &#xff08;2&#xff09;线程和协程可以共享同一个进程的资源&#xff0c;避免多个进程之间的资源浪…

线程与协程

线程与协程 概念进程【进程间通信&#xff08;IPC&#xff09;】 线程协程 区别场景计算密集型IO密集型两种操作如何优化哪些语言对多协程的支持 概念 进程 二进制可执行文件在计算机内存里的一个运行实例。比如.exe文件是个类&#xff0c;进程就是new出来的那个实例&#xf…

总结:协程与线程

一、介绍 本文主要梳理下进程&#xff0c;线程&#xff0c;协程的概念、区别以及使用场景的选择。 二、进程 我们知道&#xff0c;一切的软件都是跑在操作系统上&#xff0c;真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程&#xff0c;知道一个程序运行完…

Java线程协程

目录 线程的实现&#xff08;OS&&JVM&#xff09; 1.内核线程实现 2.用户线程实现 3.混合实现 4.Java线程的实现 ——如何实现不受Java虚拟机规范的约束 Java线程调度——系统自动完成&#xff08;可能被干预&#xff09; Java线程状态转换 内核线程的局限 协…

CDH6.3.2安装文档

正式安装之前&#xff0c;先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理&#xff0c;并提供了hadoop的两个核心功能&#xff1a;可扩展存储和分布式计算&#xff0c;以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件&#xff0c;提供了基…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库&#xff0c;基于三台阿里云服务器从零开始搭建CDH集群&#xff0c;节点配置信息如下&#xff1a; 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff…

CDH5.8安装说明

#CDH5.8安装说明 (Hadoop) 使用过Ambari&#xff0c;不知道是因为没有商业运作支撑还是社区活跃度有限&#xff0c;总体管理能力只能算凑合。很多Hadoop组件版本都不高&#xff0c;Spark也才1.3.X&#xff0c;Sqoop还是1.4.6.2.3&#xff0c;相对版本都比较低&#xff0c;而且…

大数据CDH安装详细教程

1.环境准备 1.1 服务器配置(理想配置) 1.2 修改主机名和hosts文件(所有节点) [roothadoop001 ~]# vim /etc/hosts vim /etc/hostname1.3 关闭防火墙 systemctl stop firewalld systemctl disable firewalld1.4 SSH免密登录(主节点) ssh-keygen -t rsa #分发到所有节点 ssh…

CDH6安装

官方文档 https://www.cloudera.com/documentation/enterprise/6/6.0/topics/installation.html 安装之前 JDK兼容性在不同的Cloudera Manager和CDH版本中也有所不同。某些版本的CDH 5与JDK 7和JDK 8兼容。在这种情况下&#xff0c;请确保所有服务都部署在同一主要版本上。例…

Cloudera(CDH) 简介和在线安装

实验背景 笔者需要维护线上的hadoop集群环境&#xff0c;考虑在本地搭建一套类似的hadoop集群&#xff0c;便于维护与管理。 Cloudera 简介 经过搜索发现Cloudera产品很适合笔者当前需求&#xff0c;于是开始研究Cloudera&#xff08;CDH&#xff09;的安装与使用&#xff0c;参…

CDH6.3.1安装

CDH6.3.1安装遇到很多问题&#xff0c;我想主要是由于条件有限&#xff0c;毕竟自己的电脑内存不如专业集群的内存大&#xff08;如果是内存和硬盘充足&#xff0c;有些是可以避免的&#xff0c;甚至不会出现报错的情况&#xff09;&#xff0c;这里就介绍一下我用VMware安装的…

CDH安装配置

Cloudera5.14配置 准备工作 软件下载软件安装 JDK安装 所有节点 安装环境变量配置 sudo vim /etc/profile export JAVA_HOME/usr/java/default export PATH$JAVA_HOME/bin:$PATH 使用root用户 echo "JAVA_HOME/usr/java/default" >> /etc/environment …