Java 中的虚拟线程

ops/2024/10/19 1:57:12/

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. 使用方式

创建单个虚拟线程

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

使用ExecutorService创建虚拟线程

java">try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> {executor.submit(() -> {// 任务代码});});
}
java">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.ppmy.cn/ops/121974.html

相关文章

golang web笔记-3.响应ResponseWriter

简介 从服务器向客户端返回响应需要使用 ResponseWriter&#xff0c;ResponseWriter是一个接口&#xff0c;handler用它来返回响应。 ResponseWriter常用方法 Write&#xff1a;接收一个byte切片作为参数&#xff0c;然后把它写入到响应的body中。如果Write被调用时&a…

大厂出来的人为什么不比你高效?

在最近参加的一个线下聚会上&#xff0c;有人问我&#xff1a;“我们单位有来自阿里、腾讯、华为这些大厂的人&#xff0c;为什么我没觉得他们做事比我们这些没大厂经历的人更有章法和效率&#xff1f;”你别说&#xff0c;这一问所反映的现象&#xff0c;与我在阿里巴巴工作时…

【从0开始搭建微服务并进行部署】SpringBoot+dubbo+zookeeper

文章目录 说明环境搭建创建项目父模块设置子模块 dubbo-api子模块 dubbo-provider子模块 dubbo-consumer测试项目 docker部署项目完整项目地址 说明 jdk1.8SpringBoot2.x低版本dubbo&#xff1a;请查看之前教程【微服务】SpringBootDubboZooKeeper 实战 关于本教程将采用jdk1…

19.3 打镜像部署到k8s中,prometheus配置采集并在grafana看图

本节重点介绍 : 打镜像&#xff0c;导出镜像&#xff0c;传输到各个节点并导入运行该项目配置prometheus和grafana 打镜像 本地build docker build -t ink8s-pod-metrics:v1 .build过程 导出镜像 docker save ink8s-pod-metrics > ink8s-pod-metrics.tar 传输到各个node…

10.2今日错题解析(软考)

目录 前言面向对象技术——设计模式的应用场景系统开发基础——概要设计与详细设计 前言 这是用来记录我备考软考设计师的错题的&#xff0c;今天知识点为设计模式的应用场景、概要设计与详细设计&#xff0c;大部分错题摘自希赛中的题目&#xff0c;但相关解析是原创&#xf…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词&#xff1a;CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本&#xff1a;API10 - API12&#xff08;该问题已反馈&#xff0c;期望后续官方能增加页面级控制能力&#xff09; 在正常的鸿蒙app开发过程中&…

Cyber Weekly #27

赛博新闻 1、ChatGPT迎来交互界面大改 10月4日凌晨&#xff0c;ChatGPT推出了Canvas功能&#xff0c;这是一个全新的交互界面&#xff0c;允许用户在写作和编码方面与ChatGPT进行更紧密的协作。Canvas被设计为一个更大的协作空间&#xff0c;能够随着用户的偏好不断演变&…

计数排序(counting sort)

计算排序是一种通过计算每个元素出现的次数来进行排序的算法。它不比较元素&#xff0c;而是利用数组来“计数”&#xff0c;所以在某些情况下&#xff0c;它能比传统的比较排序快。 计数排序首先要找到要排序数组的最大值&#xff0c;然后创建一个统计数组存储每个排序元素的…