首页 > 编程语言 >Java中的虚拟线程与并发编程优化

Java中的虚拟线程与并发编程优化

时间:2024-07-22 22:09:02浏览次数:9  
标签:Java Thread 编程 System 虚拟 线程 executor public

Java中的虚拟线程与并发编程优化

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的虚拟线程及其对并发编程的优化。虚拟线程是Java 21引入的一个新特性,它可以显著提高应用的并发性能,并简化线程的管理。我们将介绍虚拟线程的基本概念、用法以及如何使用它们优化并发编程。

一、虚拟线程概述

虚拟线程(Virtual Threads)是Java中的一种轻量级线程实现。与传统的操作系统线程相比,虚拟线程更轻便、更高效,适用于大规模并发任务。虚拟线程的关键优势在于它们的创建和销毁开销远低于传统线程,使得可以在应用中使用数百万个线程而不会出现性能瓶颈。

二、虚拟线程的创建与使用

  1. 创建虚拟线程

    在Java中,创建虚拟线程非常简单。使用Thread.ofVirtual()方法可以创建一个虚拟线程:

    package cn.juwatech.threads;
    
    public class VirtualThreadExample {
        public static void main(String[] args) {
            Thread vThread = Thread.ofVirtual().start(() -> {
                for (int i = 0; i < 10; i++) {
                    System.out.println("Virtual Thread: " + i);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
            });
    
            // Wait for the virtual thread to complete
            try {
                vThread.join();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
    

    在这个示例中,我们使用Thread.ofVirtual().start()创建并启动了一个虚拟线程,并在该线程中执行一个简单的任务。

  2. 虚拟线程与线程池

    虚拟线程可以与线程池结合使用,ExecutorServicenewThread()方法也支持虚拟线程:

    package cn.juwatech.threads;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    
    public class VirtualThreadPoolExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory());
    
            for (int i = 0; i < 10; i++) {
                final int taskId = i;
                executor.submit(() -> {
                    System.out.println("Task " + taskId + " executed by " + Thread.currentThread());
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
    
            executor.shutdown();
        }
    }
    

    这里,我们使用Executors.newThreadPerTaskExecutor()创建了一个支持虚拟线程的线程池,然后提交了多个任务。每个任务都在虚拟线程中执行。

三、虚拟线程与并发编程优化

  1. 优化高并发任务

    虚拟线程特别适合处理大量并发任务。例如,在处理大量网络请求时,虚拟线程可以大大减少资源消耗:

    package cn.juwatech.threads;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    
    public class HighConcurrencyExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory());
    
            for (int i = 0; i < 100000; i++) {
                final int taskId = i;
                executor.submit(() -> {
                    // Simulate handling a network request
                    System.out.println("Handling request " + taskId);
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
    
            executor.shutdown();
        }
    }
    

    在这个示例中,我们使用虚拟线程池处理了大量的并发任务,虚拟线程的轻量级特性确保了系统不会因线程数量过多而导致资源耗尽。

  2. 简化异步编程

    虚拟线程使得异步编程更加简单。例如,我们可以使用虚拟线程轻松实现异步任务,而不需要复杂的回调机制:

    package cn.juwatech.threads;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    
    public class AsyncExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory());
    
            executor.submit(() -> {
                System.out.println("Starting async task");
                try {
                    Thread.sleep(2000); // Simulate async work
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                System.out.println("Async task completed");
            });
    
            System.out.println("Main thread continues");
            executor.shutdown();
        }
    }
    

    这个例子展示了如何在虚拟线程中执行异步任务,同时主线程继续执行其他工作。

  3. 提升资源利用率

    传统线程在高并发情况下容易导致资源浪费,而虚拟线程的高效调度能够显著提升资源利用率。使用虚拟线程时,我们可以有效减少上下文切换和内存占用:

    package cn.juwatech.threads;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    
    public class ResourceUtilizationExample {
        public static void main(String[] args) {
            ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory());
    
            for (int i = 0; i < 10000; i++) {
                executor.submit(() -> {
                    // Simulate a lightweight task
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
    
            executor.shutdown();
        }
    }
    

    这个示例展示了如何使用虚拟线程池处理大量轻量级任务,同时保持良好的资源利用率。

四、虚拟线程与传统线程的比较

  1. 性能对比

    虚拟线程相比传统线程具有更低的创建和销毁开销。以下是一个性能对比的简单示例:

    package cn.juwatech.threads;
    
    public class PerformanceComparison {
        public static void main(String[] args) {
            long startTime = System.currentTimeMillis();
    
            for (int i = 0; i < 10000; i++) {
                Thread thread = new Thread(() -> {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
                thread.start();
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
    
            long endTime = System.currentTimeMillis();
            System.out.println("Traditional threads time: " + (endTime - startTime) + " ms");
    
            startTime = System.currentTimeMillis();
    
            ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory());
            for (int i = 0; i < 10000; i++) {
                executor.submit(() -> {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
            executor.shutdown();
            while (!executor.isTerminated()) {
                // Wait for all tasks to finish
            }
    
            endTime = System.currentTimeMillis();
            System.out.println("Virtual threads time: " + (endTime - startTime) + " ms");
        }
    }
    

    在这个示例中,我们比较了使用传统线程和虚拟线程执行相同任务的时间,虚拟线程通常会表现出更好的性能。

  2. 资源消耗

    虚拟线程的资源消耗远低于传统线程,因为它们不需要为每个线程分配独立的操作系统资源。以下是一个展示虚拟线程资源消耗的示例:

    package cn.juwatech.threads;
    
    import java.lang.management.ManagementFactory;
    import java.lang.management.ThreadMXBean;
    
    public class ResourceConsumptionExample {
        public static void main(String[] args) {
            ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    
            long startThreads = threadMXBean.getThreadCount();
    
            ExecutorService executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory());
            for (int i = 0; i < 10000; i++) {
                executor.submit(() -> {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
            executor.shutdown();
            while (!executor.isTerminated()) {
                // Wait for all tasks to finish
            }
    
            long endThreads = threadMXBean.getThreadCount();
            System.out.println("Thread count before: " + startThreads);
            System.out.println("Thread count after: " + endThreads);
        }
    }
    

    这个例子展示了使用虚拟线程前后的线程数量变化,虚

拟线程的数量变化较小,资源消耗也较低。

结论

虚拟线程是Java中一个强大的新特性,可以极大地优化并发编程。在高并发任务、异步编程和资源利用等方面,虚拟线程表现出了显著的优势。通过合理利用虚拟线程,我们可以提升应用的性能和资源利用率,简化并发编程模型。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:Java,Thread,编程,System,虚拟,线程,executor,public
From: https://www.cnblogs.com/szk123456/p/18317070

相关文章

  • 使用Java和Reactive Streams构建流式应用
    使用Java和ReactiveStreams构建流式应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨如何使用Java和ReactiveStreams构建流式应用。流式应用能够高效处理异步数据流,尤其适合处理大量数据和实时数据的场景。ReactiveStreams是一个......
  • 使用Java和Spring WebFlux构建响应式微服务
    使用Java和SpringWebFlux构建响应式微服务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Java和SpringWebFlux构建响应式微服务。SpringWebFlux是Spring框架的一部分,专为创建响应式应用程序而设计。在这篇文章中,我们将介绍如何......
  • 超热门!身份证实名认证接口Java调用示例
    一、什么是身份证实名认证?输入姓名、身份证号,校验此两项是否匹配,同时返回生日、性别、籍贯等信息。二、身份证实名认证接口适用哪些场景呢?金融领域、电商与支付、社交与通讯、交通与出行、在线教育与培训等。三、如何用Java快速调用该接口呢?以下以阿里云为例:接口地址:身份......
  • java做算法题可以用到的方法(都是很常用的)
    java做算法题可以用到的方法(都是很常用的)数组排序(从小到大)将字符串大写字母转为小写替换字符串中符合某种规则的字符去除字符串两端的空白字符分割字符串将数组转换为列表两数比较取较大/较小的数字int类型转换为String类型赋予int类型一个最大数(算法题中一般用于初始化一......
  • 2024年Java高级开发工程师面试准备
    20240722前三步因为是在20年找工作的时候已经充分学习过,所以现在基本只需要读一遍即可第一步:Java基础(CYC2018[2.1-2.4]+JavaGuide[第二章])Java基础+JVM+多线程+Java集合第二步:计算机基础(算法和设计模式靠积累,计算机网络和操作系统读一遍:CYC2018[3.1-3.2]+JavaGuide[......
  • C# 网络编程
    C#网络编程:.NET开发者的核心技能 合集-C#基础(1) 1.C#网络编程:.NET开发者的核心技能07-22收起 前言数字化时代,网络编程已成为软件开发中不可或缺的一环,尤其对于.NET开发者而言,掌握C#中的网络编程技巧是迈向更高层次的必经之路。无论是构建高性能......
  • Java基础-学习笔记06
    **06访问修饰符封装继承多态**访问修饰符public公开级别,对外公开protected受保护级别,对子类和同一个包中的类公开default默认级别,无修饰符,向同一个包的类公开private私有级别,只有类本身可以访问,不对外公开修饰符可以用来修饰类中的属性,成员方法以及类只有默认......
  • Javase-11.多态
    1.什么是多态?多态的概念:通俗来说就是多种形态.具体点就是去完成某个行为时,不同的对象去完成会产生不同的状态.比如:同样是打印,彩色打印机打印出来的纸是彩色的,而黑白打印机打印出来的是黑白色的.多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。2.......
  • Java 经典排序算法代码 + 注释分析(冒泡、选择、插入、希尔、快排、计数、堆排、归并)
    Java经典排序算法代码+注释分析(冒泡、选择、插入、希尔、快排、计数、堆排、归并)以下是八种经典排序算法的代码,Java8亲测可用,可以直接运行importjava.util.Arrays;publicclassSort{privatestaticfinalint[]nums={3,44,38,5,47,15,36,26,27......
  • java毕业设计-基于springboot+vue的校园二手交易系统,基于java的校园二手交易系统,基于j
    文章目录前言演示视频项目背景项目架构和内容获取(文末获取)具体实现截图前台功能管理后台技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站前言博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......