IT袋

当前位置:主页 > 经验教程 > 建站编程 >

JDK19推出新特性虚拟线程是什么

JDK19推出新特性虚拟线程是什么?(3)

时间:2024-01-23 15:00:32 来源:IT袋 作者:马勇
导读:JDK19推出新特性虚拟线程是什么,易于管理和观察:虚拟线程是轻量级的,其创建、切换和管理都更加简单和快速。此外,由于虚拟线程共享同一个进程的资源,因此可以使用现有的工具和

JDK19推出新特性虚拟线程是什么

  • 易于管理和观察:虚拟线程是轻量级的,其创建、切换和管理都更加简单和快速。此外,由于虚拟线程共享同一个进程的资源,因此可以使用现有的工具和框架来观察和管理虚拟线程。
  • 「虚拟线程与平台线程的区别」:

    1. 虚拟线程是守护线程,不能通过setDaemon(false)方法将其更改为非守护线程。当所有启动的非守护进程线程都终止时,JVM将终止,这意味着JVM不会等待虚拟线程完成后才退出。
    2. 虚拟线程的优先级始终为normal,并且不能通过setPriority()方法更改。在虚拟线程上调用此方法没有效果。
    3. 虚拟线程不支持stop()、suspend()或resume()等方法。在虚拟线程上调用这些方法将抛出UnsupportedOperationException异常。
    4. 虚拟线程并不与特定的操作系统线程绑定,其与操作系统线程的映射关系比例也不是1:1,而是m:n。虚拟线程通常是由Java运行时来调度的,而不是操作系统。当在虚拟线程中运行的代码调用阻塞的I/O操作时,Java运行时会将虚拟线程挂起,直到其可以恢复为止。

    「如何使用虚拟线程」:通过Thread.startVirtualThread()可以运行一个虚拟线程:

    Thread.startVirtualThread(() -> {
        System.out.println("虚拟线程执行中...");
    });

    通过Thread.Builder也可以创建虚拟线程,Thread类提供了ofPlatform()来创建一个平台线程、ofVirtual()来创建虚拟现场。

    Thread.Builder platformBuilder = Thread.ofPlatform().name("平台线程");
    Thread.Builder virtualBuilder = Thread.ofVirtual().name("虚拟线程");
    Thread t1 = platformBuilder .start(() -> {...}); 
    Thread t2 = virtualBuilder.start(() -> {...});

    线程池也支持了虚拟线程,可以通过Executors.newVirtualThreadPerTaskExecutor()来创建虚拟线程:

    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
        IntStream.range(0, 10000).forEach(i -> {
            executor.submit(() -> {
                Thread.sleep(Duration.ofSeconds(1));
                return i;
            });
        });
    }

    其实并不建议虚拟线程和线程池一起使用,因为Java线程池的设计是为了避免创建新的操作系统线程的开销,但是创建虚拟线程的开销并不大,所以其实没必要放到线程池中。

    「性能差异」从Runnable创建10000个线程,并使用虚拟线程和平台线程执行它们,以比较两者的性能。

    final AtomicInteger atomicInteger = new AtomicInteger();
    Runnable runnable = () -> {
      try {
        Thread.sleep(Duration.ofSeconds(1));
      } catch(Exception e) {
          System.out.println(e);
      }
      System.out.println("Work Done - " + atomicInteger.incrementAndGet());
    };

    传统线程实现:

    Instant start = Instant.now();
    try (var executor = Executors.newFixedThreadPool(100)) {
      for(int i = 0; i < 10_000; i++) {
        executor.submit(runnable);
      }
    }
    Instant finish = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis();  
    System.out.println("总耗时 : " + timeElapsed);

    相关阅读

    • FIT AP的原理及优势

      FIT AP的原理及优势

      一篇IT技术小知识,为您介绍方面的讲解,具体内容如下: 随着无线网络技术的不断发展,新型的FIT AP开始逐渐崭露头角。 FIT AP是“Fit(适配)”的缩写,它的设计理念是更加智能和灵活地适

    • 虚拟化ESXi常见故障问题及解决方案

      虚拟化ESXi常见故障问题及解决方案

      为网友们详解虚拟化ESXi常见故障问题及解决方案的介绍,相关内容具体如下: 一、 针对VMWare集群相关问题 1.1 问题 1) ESXi集群资源不足,存在很多虚拟机,配置很高,资源利用率很低;业务

    • 怎样免费ppt模板制作 免费的ppt模板网站推荐

      怎样免费ppt模板制作 免费的ppt模板网站推荐

      小编带来的是怎样免费ppt模板制作和免费的ppt模板网站推荐的内容,接下来一起来看看吧。 年末了,又是一个做年终总结的时候,你的年终报告需要用到PPT吗?最近我的同事一直在问我:你的

    • 如何创建网址链接 免费创建网站的平台推荐

      如何创建网址链接 免费创建网站的平台推荐

      一篇很详细的教程是关于如何创建网址链接和免费创建网站的平台推荐方面的讲解,具体介绍如下: 我们处在一个信息发达的互联网时代,广大用户活跃在网络世界里。用户如果想要了解一家