专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  5.6K ... ·  14 小时前  
ImportNew  ·  亚马逊程序员破防:AI ... ·  2 天前  
芋道源码  ·  我用这11招,让接口性能提升了100倍 ·  2 天前  
51好读  ›  专栏  ›  芋道源码

Java 21 新特性的实践,确实很丝滑!

芋道源码  · 公众号  · Java  · 2025-05-19 09:30

正文

请到「今天看啥」查看全文


  • 作用域值(预览)
  • 结构化并发(预览)
  • 1 虚拟线程

    从 Java 代码的角度来看,虚拟线程感觉就像普通线程,但它们没有 1:1 映射到操作系统/平台线程。它是从虚拟线程到载体线程进而到操作系统线程的M:N映射。

    有一个所谓的载体线程池,虚拟线程临时映射(“安装”)到该线程池上。一旦虚拟线程遇到阻塞操作,虚拟线程就会从载体线程中移除(“卸载”),并且载体线程可以执行另一个虚拟线程(新的或之前被阻塞的虚拟线程)。

    载体线程池是ForkJoinPool

    虚拟线程的一些优点:

    • 提高应用程序吞吐量
    • 提高应用程序可用性
    • 减少内存消耗

    创建虚拟线程

    要创建虚拟线程,我们可以使用 Thread.ofVirtual() 工厂方法并传递可运行对象。

    1. Thread.ofVirtual().start(Runnable);
    2. Thread.ofVirtual().unstarted(Runnable);

    如果你想让虚拟线程立即启动,你可以使用 start() 方法,它会立即执行传递给它的 Runnable start()

    如果不希望虚拟线程立即启动,可以使用该 unstarted() 方法。

    创建使用虚拟线程的ExecutorService

    我们只需要替换 newFixedThreadPool newVirtualThreadPerTaskExecutor

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    public class VirtualThreadExample {

        public static void main(String[] args) {
            ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();

            executor.submit(() -> {
                System.out.println(Thread.currentThread().getName())
            });

            executor.shutdown();
        }
    }

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

    • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
    • 视频教程:https://doc.iocoder.cn/video/

    2 顺序集合

    顺序集合为我们提供了defined encounter order(是一种所见即所得的顺序,含义是从队列中取出元素的顺序既是你存放该元素时候的顺序),用于访问第一个和最后一个元素并以相反的顺序迭代。

    这意味着我们可以在集合的两端添加、检索或删除元素。

    public interface SequencedCollection<Eextends Collection<E{
        default void addFirst(E e) { ... }
        default void addLast(E e) { ... }
        default E getFirst() { ... }
        default E getLast() { ... }
        default E removeFirst() { ... }
        default E removeLast() { ... }
        SequencedCollection reversed();
    }

    正如我们所看到的,除了 reverse() 之外的所有方法都是默认方法并提供默认实现。

    这意味着现有的集合类(例如 ArrayList 和 LinkedList)都可以实现此接口,而无需更改其代码。

    ArrayList list = new ArrayList<>();
            list.add(1); // [1]
            list.addFirst(0); // [0, 1]
            list.addLast(2); // [0, 1, 2]
            list.getFirst(); // 0
            list.getLast(); // 2
            list.reversed(); // [2, 1, 0]







    请到「今天看啥」查看全文