当前位置: 首页 > news >正文

Java 中的虚拟线程

1. 是什么

Java中的虚拟线程(Virtual Threads)是在JDK 19中引入的一个新特性,它是一种轻量级的线程实现。虚拟线程旨在简化并发编程,提高应用程序的吞吐量,特别是在处理大量并发任务时。

2. 作用

  1. 提高并发性能:虚拟线程可以创建大量轻量级线程,减少系统资源消耗。
  2. 简化并发编程:使用虚拟线程可以用同步的方式编写异步代码,提高代码可读性。
  3. 提高系统吞吐量:特别是在I/O密集型应用中,可以显著提高系统的吞吐量。

3. 使用场景

  1. I/O密集型应用:如网络服务器、数据库操作、文件处理等。
  2. 微服务架构:处理大量并发请求的微服务。
  3. 任务调度系统:需要管理大量并发任务的系统。
  4. 爬虫应用:并发处理多个网页请求。
  5. 批处理应用:并行处理大量数据。

4. 和普通多线程对比

特性虚拟线程普通线程
实现方式由JVM管理,基于用户态线程由操作系统管理,基于内核态线程
资源消耗轻量级,可以创建大量(百万级)较重,通常限制在几千个
上下文切换快速,在用户态完成较慢,需要内核态切换
阻塞行为不会阻塞底层系统线程会阻塞系统线程
适用场景I/O密集型任务,高并发CPU密集型任务
内存占用非常低较高
创建和销毁开销非常低较高
调度方式协作式调度抢占式调度
支持的Java版本Java 19及以上所有Java版本
与现有代码兼容性可能需要适配完全兼容
适合长时间运行的任务不适合适合
同步机制支持,但应避免长时间同步完全支持
中断机制支持支持
栈大小动态增长,初始很小固定大小,通常较大
与NIO的集成原生支持需要额外编程

5. 使用方式

创建单个虚拟线程

Thread.startVirtualThread(() -> {// 任务代码
});

使用ExecutorService创建虚拟线程

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> {executor.submit(() -> {// 任务代码});});
}
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {List<CompletableFuture<Void>> futures = new ArrayList<>();for (int i = 0; i < 10000; i++) {int taskId = i;CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 执行异步任务System.out.println("Task " + taskId + " executed by " + Thread.currentThread());}, executor);futures.add(future);}// 等待所有任务完成CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}

http://www.mrgr.cn/news/43161.html

相关文章:

  • 驱动中的device和device_driver结构体
  • 【EXCEL数据处理】000016案例 vlookup函数。
  • AVL树的创建与检测
  • 网站开发的发展(后端路由/前后端分离/前端路由)
  • mmcv building wheels时卡住,mmcv 和 mmdet版本不匹配问题
  • Makefile入门
  • 2.2Mybatis——代理与SQL映射
  • (Django)初步使用
  • 软件测试:postman详解
  • MySQL 安装
  • 多线程编程实例
  • c++结构体传参
  • Vue3中使用axios
  • Java try-with-resources语句
  • 实时数仓分层架构超全解决方案
  • ThreadLocal详解:线程本地变量的艺术
  • 今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面
  • 分布式事务(Seata-AT模式)
  • 外包功能测试干了4年,技术退步太明显了。。。。。​
  • 网站建设中,静态网页和动态网页分别是什么,有什么区别