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://openjdk.org/jeps/425

https://howtodoinjava.com/java/multi-threading/virtual-threads/

https://mccue.dev/pages/5-2-22-go-concurrency-in-java

以上是关于Java19 虚拟线程 VS Go 协程 的吞吐量的主要内容,如果未能解决你的问题,请参考以下文章

Java将增加虚拟线程,挑战Go协程

噢,老天爷! 属于Java的协程终于来了!

Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道

Golang✔️走进 Go 语言✔️ 第十六课 协程 & 通道

Go 并发编程:协程 gorotinechannel锁

Java 并发编程一文读懂线程协程守护线程