Java VirtualThread 虚拟线程的个人粗浅理解

先随便看个VirtualThread的相关资料理解虚拟线程和平台线程的概念或者看这个也行Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量

先说结论:虚拟线程依赖于ForkJoinPool()进行底层实现,ForkJoinPool()依赖于平台线程

Java VirtualThread 虚拟线程的个人粗浅理解_第1张图片
Java VirtualThread 虚拟线程的个人粗浅理解_第2张图片
上图证明虚拟线程底层依赖于ForkJoinPool(),还要注意一点ForkJoinPool()的平台线程都是守护线程与其他线程池不一致

注意事项:ThreadLocal和Synchronized存在一些问题需要避免或者考虑 参考资料:Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量

Executors提供newVirtualThreadPerTaskExecutor()方法使用虚拟线程,但是注意实现类为ThreadPerTaskExecutor此类实际上并不会复用虚拟线程而是来一个请求调用ThreadFactory的newThread()创建虚拟线程.但是因为虚拟线程的ForkJoinPool是共用的所以并没有无限创建平台线程,而且因为ForkJoinPool是当前cpu核心数的并行度所以实际创建的平台线程很少

结构化并发:
Java VirtualThread 虚拟线程的个人粗浅理解_第3张图片
对应文章使用Loom创建虚拟线程 - david
该特性可以让try内的代码对外保持同步,原理是try-with-Resource会调用java.lang.AutoCloseable#close方法而java.util.concurrent.ThreadPerTaskExecutor#close方法会检查并等待未执行完的线程
2022年9月27日 11:20:53 实际上ExecutorService也实现了close,所以Executors里的线程池都可以使用结构化并发
Java VirtualThread 虚拟线程的个人粗浅理解_第4张图片

原理探究:
Java VirtualThread 虚拟线程的个人粗浅理解_第5张图片
不再直接调用Thread的sleep()和yield()的本地方法而是重写加入了虚拟线程判断实现

学习资料:
廖雪峰-使用虚拟线程

2022年10月8日 01:57:59 VirtualThread的ThreadLocal和Synchronized后续的的解决方案应该和Thread.sleep() Thread.yield()方法类似,使用(Thread.currentThread() instanceof VirtualThread)判断是否为虚拟线程然后特殊处理

2022年10月8日 11:26:42 虚拟线程 - VirtualThread源码透视 –Continuation讲得很细,VirtualThread原理也很到位 jdk.virtualThreadScheduler.maxPoolSize可以设定最大平台线程数默认为诶256

2022年11月3日 14:51:18 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal 解释ThreadLocal存在的性能问题

2022年11月3日 17:29:58 JEP 425: Virtual Threads (Preview)-官方对虚拟线程的介绍,其中就有Threadlocal和Synchronized对应内容

2022年11月18日 16:16:57 stackoverflow的提问:为什么虚拟线程不是默认的?-答案是为了向后兼容

2023年2月20日 17:00:47 性能怪兽——JDK19的虚拟线程-言简意赅的说明了virtual thread的原理以及优点弊端

2023年3月10日 16:18:26 简单了解下JDK19预览版的 Virtual Threads-CompletableFuture netty synchronized Python Golang 等都有提到

2023年3月10日 16:51:43 浅谈有栈协程与无栈协程-virtual thread和golang的协程均为有栈协程,netty的为无栈协程

2023年3月10日 16:58:39 Java虚拟线程的核心: Continuation-virtual thread是对称协程 无栈协程效率高但是开发麻烦,有栈协程效率略低但是不需要额外开发

2023年3月17日 15:08:41 Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?-“干掉丑陋的响应式编程” “阻塞操作将不再挂起内核线程” “不再依赖线程池”

2023年3月20日 16:59:55 美团:某动态线程池框架是官方开源的么?–cubecube的回复:虚拟线程的资源消耗就和一个 Object 一个数量级,有啥可考虑的。

2023年3月21日 09:33:00 Golang、Kotlin、C#、JS、Python等都有协程,市面上的协程有什么本质上的区别?-hitsmaxft的回答:“这也是为什么他们“无栈”的原因, 真实运行起来的代码, 往往是各种零散的 forkjoin task 或者 callback function ,所以抛异常出来, 都是奇奇怪怪的半截堆栈。 而不是原来写的同步代码的样子。”
Java VirtualThread 虚拟线程的个人粗浅理解_第6张图片
2023年5月23日 14:37:59 廖雪峰的官方网站-使用虚拟线程- 计算密集型任务不应使用虚拟线程,只能通过增加CPU核心解决,或者利用分布式计算资源。

你可能感兴趣的:(JAVA,java,jvm,开发语言,virtual,thread,协程)