跳至主要內容
Java 21 虚拟线程如何限流控制吞吐量

Java 21 虚拟线程如何限流控制吞吐量

虚拟线程(Virtual Threads)是 Java 21 所有新特性中最为吸引人的内容,它可以大大来简化和增强Java应用的并发性。但是,随着这些变化而来的是如何最好地管理此吞吐量的问题。本文,就让我们看一下开发人员在使用虚拟线程时,应该如何管理吞吐量。

在大多数情况下,开发人员不需要自己创建虚拟线程。例如,对于 Web 应用程序,Tomcat 或 Jetty 等底层框架将为每个传入请求自动生成一个虚拟线程。

如果在应用程序内部需要自行调用来提供业务并发能力时,我们可以使用Java 21新特性:虚拟线程(Virtual Threads)中介绍的方法去创建和使用,比如较为常用的就是Executors.newVirtualThreadPerTaskExecutor()


程序猿DD原创大约 2 分钟JavaJavaJava 21虚拟线程
Java 21中关于Locale区域设置的变化

Java 21中关于Locale区域设置的变化

当我们要尝试解决本地化问题时,首先要验证就是JVM使用的区域设置(Locale)是哪个。在Java 21中,弄清楚JVM使用的是哪个区域设置(Locale),这项任务变得更加容易了。

查看当前配置

在Java 21中,我们可以通过使用-X:showSettings来查看localetzdata,开发者可以通过-X:showSettings:locale仅显示Locale信息,如下所示:


程序猿DD原创大约 2 分钟JavaJavaJava 21
Java 21中的两个值得关注的Bug修复

Java 21中的两个值得关注的Bug修复

在Java 21中,除了推出很多新特性之外,一些Bug修复,也需要注意一下。因为这些改变可能在升级的时候,造成影响。

Double.toString()Float.toString()的精度问题修复

比如:对于Double.String(1e23)

  • 在Java 19后,输出内容为:1.0E23
  • 在Java 18中,输出内容为:9.999999999999999E22

程序猿DD原创大约 1 分钟JavaJavaJava 21
Java 21增强对Emoji表情符号的处理了

Java 21增强对Emoji表情符号的处理了

发现一个 Java 21 中有意思的东西!在java.Lang.Character类中增加了用于确定字符是否为 Emoji 表情符号的 API,主要包含下面六个新的静态方法:

public static boolean isEmoji(int codePoint) {
  return CharacterData.of(codePoint).isEmoji(codePoint);
}

public static boolean isEmojiPresentation(int codePoint) {
  return CharacterData.of(codePoint).isEmojiPresentation(codePoint);
}

public static boolean isEmojiModifier(int codePoint) {
  return CharacterData.of(codePoint).isEmojiModifier(codePoint);
}

public static boolean isEmojiModifierBase(int codePoint) {
  return CharacterData.of(codePoint).isEmojiModifierBase(codePoint);
}
  
public static boolean isEmojiComponent(int codePoint) {
  return CharacterData.of(codePoint).isEmojiComponent(codePoint);
}

public static boolean isExtendedPictographic(int codePoint) {
  return CharacterData.of(codePoint).isExtendedPictographic(codePoint);
}

程序猿DD原创大约 2 分钟JavaJavaJava 21
Java 21 新特性:未命名类和实例的Main方法(Unnamed Classes and Instance Main Methods)

Java 21 新特性:未命名类和实例的Main方法(Unnamed Classes and Instance Main Methods)

Java 21引入了两个语言核心功能:

  • 未命名的Java类你说
  • 新的启动协议:该协议允许更简单地运行Java类,并且无需太多样板

下面一起来看个例子。通常,我们初学Java的时候,都会写类似下面这样的 Hello World 程序:

public class HelloWorld {
  
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }

}

程序猿DD原创大约 2 分钟JavaJavaJava 21
Java 21 新特性:分代ZGC(Generational ZGC)

Java 21 新特性:分代ZGC(Generational ZGC)

在 JDK 21 中,JEP 439(分代ZGC)从 Targeted 状态提升到 Completed 状态。该 JEP 建议,扩展 Z Garbage Collector(ZGC),为年轻对象和老对象维护单独的代,从而提高应用程序的性能。这将使得 ZGC 可以更频繁地收集趋于早亡的年轻对象。


A N M Bazlur Rahman大约 4 分钟JavaJavaJava 21
Java 21 新特性:虚拟线程(Virtual Threads)

Java 21 新特性:虚拟线程(Virtual Threads)

在Java 21中,引入了虚拟线程(Virtual Threads)来简化和增强并发性,这使得在Java中编程并发程序更容易、更高效。

虚拟线程,也称为“用户模式线程(user-mode threads)”或“纤程(fibers)”。该功能旨在简化并发编程并提供更好的可扩展性。虚拟线程是轻量级的,这意味着它们可以比传统线程创建更多数量,并且开销要少得多。这使得在自己的线程中运行单独任务或请求变得更加实用,即使在高吞吐量的程序中也是如此。

创建和使用虚拟线程

在Java 21中创建和使用虚拟线程有多种方法:


程序猿DD原创大约 3 分钟JavaJavaJava 21虚拟线程
Java 21新特性:Sequenced Collections(有序集合)

Java 21新特性:Sequenced Collections(有序集合)

在JDK 21中,Sequenced Collections的引入带来了新的接口和方法来简化集合处理。此增强功能旨在解决访问Java中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景。

下面一起通过本文来了解一下不同集合处理示例。

Sequenced Collections接口

Sequenced Collections引入了三个新接口:


程序猿DD原创大约 2 分钟JavaJavaJava 21
Java 21的StringBuilder和StringBuffer新增了一个repeat方法

Java 21的StringBuilder和StringBuffer新增了一个repeat方法

发现Java 21的StringBuilderStringBuffer中多了repeat方法:

    /**
     * @throws IllegalArgumentException {@inheritDoc}
     *
     * @since 21
     */
    @Override
    public StringBuilder repeat(int codePoint, int count) {
        super.repeat(codePoint, count);
        return this;
    }

    /**
     * @throws IllegalArgumentException {@inheritDoc}
     *
     * @since 21
     */
    @Override
    public StringBuilder repeat(CharSequence cs, int count) {
        super.repeat(cs, count);
        return this;
    }

程序猿DD原创大约 1 分钟JavaJavaJava 21
2