Java19 虚拟线程 VS Go 协程 的吞吐量
Posted ejinxian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java19 虚拟线程 VS Go 协程 的吞吐量相关的知识,希望对你有一定的参考价值。
Java19 带来了 Java 新特性 —— 虚拟线程。Java 新特性之前,Go 语言的协程在并发编程领域得到友好的口碑。随着国内 Go 语言的快速发展与推广,协程好像成为了一个世界上最好语言的必备特性之一。Java19 虚拟线程就是来弥补这个空白的。
- Java 线程模型
- 平台线程与虚拟线程性能对比
- Java 虚拟线程与 Go 协程对比
- 如何使用虚拟线程
java 线程 与 虚拟线程
Java 线程与系统内核线程是一一对应的,系统内核的线程调度程序负责调度 Java 线程。为了增加应用程序的性能,我们会增加越来越多的 Java 线程,显然系统调度 Java 线程时,会占据不少资源去处理线程上下文切换
多线程模型来解决 Java 并发编程的问题。为了增加系统的吞吐量,我们要不断增加线程的数量,但机器的线程是昂贵的、可用线程数量也是有限的。即使我们使用了各种线程池来最大化线程的性价比,但是线程往往会在 CPU、网络或者内存资源耗尽之前成为我们应用程序的性能提升瓶颈,不能最大限度的释放硬件应该具有的性能
创建 Java 虚拟线程
新增线程相关 API
Thread.ofVirtual()
和 Thread.ofPlatform()
是创建虚拟和平台线程的新 API
//输出线程ID 包括虚拟线程和系统线程 Thread.getId() 从jdk19废弃
Runnable runnable = () -> System.out.println(Thread.currentThread().threadId());
//创建虚拟线程
Thread thread = Thread.ofVirtual().name("testVT").unstarted(runnable);
testVT.start();
//创建虚平台线程
Thread testPT = Thread.ofPlatform().name("testPT").unstarted(runnable);
testPT.start();
二、Go 协程对比 Java 虚拟线程
定义方法体是循环 sleep 100ms,然后输出 index,将这个方法使用协程执行
Go 实现:
package main
import (
"fmt"
"time"
)
func say(s string)
for i := 0; i < 5; i++
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
func main()
go say("world")
say("hello")
Java 实现:
public final class VirtualThreads
static void say(String s)
try
for (int i = 0; i < 5; i++)
Thread.sleep(Duration.ofMillis(100));
System.out.println(s);
catch (InterruptedException e)
throw new RuntimeException(e);
public static void main(String[] args) throws InterruptedException
var worldThread = Thread.startVirtualThread(
() -> say("world")
);
say("hello");
// 等待虚拟线程结束
worldThread.join();
参考
Java19 正式 GA!看虚拟线程如何大幅提高系统吞吐量 - 开源中国倒数第一coder的个人空间 - OSCHINA - 中文开源技术交流社区
https://howtodoinjava.com/java/multi-threading/virtual-threads/
https://mccue.dev/pages/5-2-22-go-concurrency-in-java
以上是关于Java19 虚拟线程 VS Go 协程 的吞吐量的主要内容,如果未能解决你的问题,请参考以下文章
Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道