JAVA21新特性虚拟线程使用

虚拟线程特性的推出,绝对是java继jdk8之后最值得开发人员高兴的特性之一了,在实现高并发场景中,线程是阻碍并发度的一个最关键的指标,由于每个连接都需要一个线程来处理连接,而java中的线程是通过操作系统线程实现的,这就导致一个java应用不能创建太多的线程来处理连接,所以在java中一般是通过线程池的方式来处理请求:指定线程池大小来处理任务,如果任务继续提交就通过缓冲队列来排队。但是这样就会导致另外的问题,一般web端的请求都会设置超时时间,如果在指定时间内服务端没有给出响应,客户端就会断开连接,这就非常影响服务的体验。所以为了达到高并发的需求,项目都是通过集群化部署方式来解决的。
我们知道,web服务大部分是属于IO密集型,IO密集型的应用一般都需要大量的线程,所以虚拟线程非常适合这种场景,大量的虚拟线程运行在少量的平台线程上,JVM调度多个虚拟线程在特定平台线程上执行,并且在平台线程上一次只执行一个虚拟线程。

  1. 传统线程与操作系统线程之间的对应关系:
    平台线程

  2. 虚拟线程与操作系统线程对应关系:
    虚拟线程

说了很多,下面介绍一下虚拟线程创建API,为了简化重复代码的编写,首先创建一个公共Runnable实现类:

public class DemoThread implements Runnable {

    @Override
    public void run() {
        System.out.println("线程ID : " + Thread.currentThread().threadId() + "|线程名 : " + Thread.currentThread().getName() + "|是否为虚拟线程 : " + Thread.currentThread().isVirtual());
    }
}

下面通过4个api来实现虚拟线程:

  1. 直接通过Thread.startVirtualThread()创建并启动一个虚拟线程:
Thread.startVirtualThread(new DemoThread());
  1. 首先通过Thread.ofVirtual()unstarted()创建一个虚拟线程,在通过start()方法启动该线程:
Thread t1 = Thread.ofVirtual().name("virtualThread-1").unstarted(new DemoThread());
t1.start();
  1. 通过Executors.newVirtualThreadPerTaskExecutor()创建一个ExecutorService,再通过它的submit()方法提交任务:
try(ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
    executorService.submit(new DemoThread());
}
  1. 通过Thread.ofVirtual().factory()创建一个虚拟线程工厂,再通过该工厂创建虚拟线程并启动:
ThreadFactory factory = Thread.ofVirtual().factory();
Thread t2 = factory.newThread(new DemoThread());
t2.start();

虚拟线程推出后,原有创建线程的方式仍然可以使用,并且也推出了一个新的api用于创建线程:

Thread t3 = Thread.ofPlatform().unstarted(new DemoThread());
t3.start();

这里需要注意一个事情,当主线程执行完毕后,它并不会等待虚拟线程执行完成在退出,所以要想等待虚拟线程执行结果,就需要在线程启动后执行:t1.join(); 等待结果。

public class MyThreadFactory implements ThreadFactory {

    @Override
    public Thread newThread(Runnable r) {
        // 返回一个虚拟线程
//        return Thread.ofVirtual().name("virtual-1").unstarted(r);
        // 返回一个平台线程
        return Thread.ofPlatform().name("platform-1").unstarted(r);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值