跳至主要內容

Java 19新特性


Virtual Threads (Preview)(虚拟线程预览)

虚拟线程

Thread.builder接口

在jdk19中新增了一个密封(sealed)接口Builder,该接口只允许有两个子接口实现:

  • OfPlatform:创建平台线程的时候使用,是一个密封接口,只允许ThreadBuilders.PlatformThreadBuilder实现。

  • OfVirtual:创建虚拟线程的时候使用,是一个密封接口,只允许ThreadBuilders.VirtualThreadBuilder实现。

上面3种创建虚拟线程的方式本质都是通过OfVirtual来进行创建的,OfVirtual和OfPlatform接口中的api很多是相同的,OfPlatform中的方法更多,所以下面我们以OfPlatform为例演示他的使用方式。

通过OfPlatform中的factory()方法可以创建一个ThreadFactory线程工厂,学过线程池的同学对它应该并不陌生,它可以帮助我们创建出平台线程对象。

ThreadFactory threadFactory = Thread.ofPlatform().factory();

除了上面的用法之外,还可以用它来创建平台线程对象

//创建任务
Runnable task = () -> {
    System.out.println(Thread.currentThread().getName());
};

//将任务放到t线程中并运行
Thread t = Thread.ofPlatform().start(task);

上面创建平台线程的方式跟之前的new Thread是一样的,优点是我们可以用它来实现链式编程,比如要设置线程优先级,线程名字,守护线程:

//创建任务
Runnable task = () -> {
    System.out.println(Thread.currentThread().getName());
};

//链式编程
Thread.ofPlatform().name("小").priority(Thread.MAX_PRIORITY).daemon(true).start(task);

虚拟线程中的ThreadLocal

由于虚拟线程的数量会比较多,所以在使用ThreadLocal的时候一定要注意。线程池中的线程在执行多个任务的时候,不要使用ThreadLocal。在Thread.Builder中提供了不支持ThreadLocal的方法。

Thread.ofVirtual().allowSetThreadLocals(false);
Thread.ofVirtual().inheritInheritableThreadLocals(false);

LockSupport对虚拟线程的支持

LockSupport是支持虚拟线程的,当调用park()方法时,虚拟线程会解除挂载,这样平台线程可以执行其他的操作,当调用unpark()方法时,虚拟线程会被调度器重新挂载到平台线程,再继续工作。

java.io包下类的变化

为了减少内存的使用,BufferedOutputStream,BufferedWriter,OutputStreamWriter中默认的初始数组大小由之前的8192变成了512。

seven97官方微信公众号
seven97官方微信公众号