深入理解Java多线程与线程池:提升程序性能的利器


✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 
🎈🎈作者主页: 喔的嘛呀🎈🎈

目录

引言

一、实现多线程

1.1. 继承Thread类

1.2. 实现Runnable接口

1.3. 区别与选择

总结

二.线程池

创建线程池

FixedThreadPool(固定大小线程池)

CachedThreadPool(缓存线程池)

ScheduledThreadPool(定时任务线程池)

提交任务给线程池执行

关闭线程池

完整示例

总结

三、使用线程池提高程序性能

步骤一:创建线程池

步骤二:提交任务给线程池执行

步骤三:关闭线程池

总结

总结


引言

在Java中,多线程是一种重要的编程方式,可以提高程序的并发性和性能。本篇博客将详细介绍如何实现Java中的多线程,以及如何使用线程池来提高程序性能。

一、实现多线程

在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。下面分别介绍这两种方式的实现方法。

1.1. 继承Thread类

继承Thread类并重写run方法来定义线程的执行逻辑。

class MyThread extends Thread {
    public void run() {
        System.out.println("Thread running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

1.2. 实现Runnable接口

实现Runnable接口,并将其实例传递给Thread类的构造方法。

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Thread running");
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start(); // 启动线程
    }
}

1.3. 区别与选择

  • 继承Thread类:简单直观,但限制了类的继承关系。
  • 实现Runnable接口:避免了单继承的局限性,更符合面向对象设计原则。

通常推荐使用实现Runnable接口的方式来实现多线程,因为它更灵活,可以更好地管理和维护线程。

总结

通过以上两种方式,可以实现Java中的多线程。选择合适的方式取决于具体的需求和项目架构,但一般来说,实现Runnable接口是更好的选择。

二.线程池

线程池是一种管理和复用线程的机制,可以减少线程创建和销毁的开销,提高程序性能。Java提供了Executors工厂类来创建不同类型的线程池。

创建线程池

Java提供了几种不同类型的线程池,常用的有FixedThreadPool、CachedThreadPool和ScheduledThreadPool。

FixedThreadPool(固定大小线程池)

ExecutorService executor = Executors.newFixedThreadPool(5); // 创建固定大小的线程池,可以容纳5个线程

CachedThreadPool(缓存线程池)

ExecutorService executor = Executors.newCachedThreadPool(); // 创建一个根据需求自动扩展的线程池

ScheduledThreadPool(定时任务线程池)

ScheduledExecutorService executor = Executors.newScheduledThreadPool(3); // 创建一个可以执行定时任务的线程池,可以容纳3个线程

提交任务给线程池执行

通过submit方法将任务提交给线程池执行。

executor.submit(new Runnable() {
    public void run() {
        System.out.println("Task running");
    }
});

关闭线程池

在程序结束时,需要手动关闭线程池以释放资源。

executor.shutdown(); // 等待所有任务执行完毕后关闭线程池

完整示例

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

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        
        for (int i = 0; i < 10; i++) {
            executor.submit(new Runnable() {
                public void run() {
                    System.out.println("Task running");
                }
            });
        }
        
        executor.shutdown();
    }
}

总结

通过使用线程池,可以更加灵活地管理和复用线程,避免了频繁创建和销毁线程的开销,提高了程序的性能和效率。根据实际需求选择合适的线程池类型可以更好地满足程序的需求。

三、使用线程池提高程序性能

线程池是一种管理和复用线程的机制,可以减少线程创建和销毁的开销,提高程序性能。Java提供了Executors工厂类来创建不同类型的线程池,下面详细介绍如何使用线程池提高程序性能。

步骤一:创建线程池

使用Executors工厂类创建一个线程池。可以根据实际需求选择不同类型的线程池,如FixedThreadPool、CachedThreadPool等。

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

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个固定大小为5的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

步骤二:提交任务给线程池执行

将任务通过submit方法提交给线程池执行。

        // 提交任务给线程池执行
        for (int i = 0; i < 10; i++) {
            executor.submit(new Runnable() {
                public void run() {
                    System.out.println("Task running");
                }
            });
        }

步骤三:关闭线程池

在程序执行完毕后,需要关闭线程池以释放资源。

executor.shutdown();

示例代码:

演示如何使用线程池处理一批耗时任务。假设我们有一批需要处理的数据列表,我们可以使用线程池来并发处理这些数据,提高处理效率。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolTaskExample {
    public static void main(String[] args) {
        // 模拟需要处理的数据列表
        List<Integer> dataList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            dataList.add(random.nextInt(100));
        }

        // 创建一个固定大小为3的线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 提交处理任务给线程池执行
        for (Integer data : dataList) {
            executor.submit(new ProcessTask(data));
        }

        // 关闭线程池
        executor.shutdown();
    }

    // 处理任务类
    static class ProcessTask implements Runnable {
        private Integer data;

        public ProcessTask(Integer data) {
            this.data = data;
        }

        public void run() {
            // 模拟数据处理过程
            System.out.println("Processing data: " + data + " in thread: " + Thread.currentThread().getName());
            try {
                // 模拟数据处理耗时
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Data processed: " + data);
        }
    }
}

       在这个示例中,我们模拟了一个数据处理任务,通过线程池并发处理多个数据。线程池的大小为3,即最多同时处理3个数据,其他数据会等待空闲线程。这样可以有效地利用系统资源,提高处理效率。                

总结

通过使用线程池,可以有效地管理和复用线程,避免了频繁创建和销毁线程的开销,提高了程序的性能和效率。合理地选择线程池的大小和类型,可以更好地满足程序的需求,避免系统资源被耗尽。

总结

使用线程池可以提高程序的性能,主要体现在以下几个方面:

  1. 减少线程创建和销毁的开销:线程池可以复用线程,避免频繁创建和销毁线程的开销,提高了线程的利用率。

  2. 控制并发线程数量:线程池可以控制并发线程的数量,避免系统资源被耗尽,保证系统的稳定性和响应性。

  3. 提高任务处理效率:通过并发执行任务,可以加快任务处理的速度,提高程序的整体性能。

  4. 提高系统的响应速度:通过合理配置线程池的大小和类型,可以更好地响应用户的请求,提高系统的响应速度。

综上所述,使用线程池可以有效地提高程序的性能和效率,是多线程编程中的重要技术之一。

         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/446856.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

Linux:非常实用的Linux命令

非常实用的Linux命令 系统服务管理 systemctl systemctl命令是Systemd系统和服务管理器的一部分&#xff0c;用于控制systemd系统和服务管理器。Systemd是大多数最新的Linux发行版使用的初始化系统和服务管理器&#xff0c;它用于启动守护进程并管理它们的运行。systemctl提…

基于Java+springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

C++类和对象(六):初始化列表

再谈构造函数 初始化列表 问题描述&#xff1a;虽然之前调用构造函数后&#xff0c;对象中的成员变量已经有了初始值&#xff0c;但是这仍然不能称之为对对象中成员变量的初始化&#xff0c;只能叫做赋初值&#xff0c;因为成员变量只能被初始化一次&#xff0c;而之前的构造…

Java 基于微信小程序的快递柜小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

P8680 [蓝桥杯 2019 省 B] 特别数的和:做题笔记

目录 思路 代码 题目链接&#xff1a; P8680 [蓝桥杯 2019 省 B] 特别数的和 思路 最开始我思路主要是从数字转字符串上想的。因为我们需要判断每一位是否是特殊数&#xff0c;字符串很容易做到这一点&#xff0c;只是在数字相加这一步不好实现。 需要用到字符串与数字的…

新IDEA电脑环境设置

1.设置UTF-8 2.Maven 3.JRE选对

FPGA - 科学设计复位信号(XILINX)

1&#xff0c;同步复位与异步复位 简单来说&#xff1a;复位信号与时钟同步&#xff0c;称之为同步复位。 复位信号与时钟不同步&#xff0c;称之为异步复位。 2、xilinx 的复位策略 ① 同步高复位 ② 计数器和状态机必须复位 ③ 能不使用复位尽量不使用复位&#xff0c;比如中…

使用Spring的AOP

使用Spring的AOP 一、AOP 的常用注解1.切面类Aspect2.Pointcut3.前置通知Before4.后置通知AfterReturning5.环绕通知Around6.异常通知AfterThrowing7.最终通知After8.切面顺序Order9.启用自动代理EnableAspectJAutoProxy 二、AOP注解方式开发三、AOP 全注解开发四、基于XML配置…

java中使用rabbitmq

文章目录 前言一、引入和配置1.引入2.配置 二、使用1.队列2.发布/订阅2.1 fanout(广播)2.2 direct(Routing/路由)2.3 Topics(主题)2.4 Headers 总结 前言 mq常用于业务解耦、流量削峰和异步通信,rabbitmq是使用范围较广,比较稳定的一款开源产品,接下来我们使用springboot的sta…

资料下载-嵌入式 Linux 入门

学习的第一步是去下载资料。 1. 有哪些资料 所有资料分 4 类&#xff1a; ① 开发板配套资料(原理图、虚拟机的映像文件、烧写工具等)&#xff0c;放在百度网盘 ② 录制视频过程中编写的文档、源码、图片&#xff0c;放在 GIT 仓库 ③ u-boot、linux 内核、buildroot 等比较大…

机器学习评价指标(分类、目标检测)

https://zhuanlan.zhihu.com/p/364253497https://zhuanlan.zhihu.com/p/46714763https://blog.csdn.net/u013250861/article/details/123029585 1.1 混淆矩阵 在介绍评价指标之前&#xff0c;我们首先要介绍一下混淆矩阵&#xff08;confusion matrix&#xff09;。混淆矩阵…

C++的类与对象(五):赋值运算符重载与日期类的实现

目录 比较两个日期对象 运算符重载 赋值运算符重载 连续赋值 日期类的实现 Date.h文件 Date.cpp文件 Test.cpp文件 const成员 取地址及const取地址操作符重载 比较两个日期对象 问题描述&#xff1a;内置类型可直接用运算符比较&#xff0c;自定义类型的对象是多个…

《日期类》的模拟实现

目录 前言&#xff1a; 头文件类与函数的定义Date.h 实现函数的Date.cpp 测试Test.cpp 运行结果&#xff1a; 前言&#xff1a; 我们在前面的两章初步学习认识了《类与对象》的概念&#xff0c;接下来我们将实现一个日期类&#xff0c;是我们的知识储备更加牢固。 头文件…

角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…

【JAVA】CSS3:3D、过渡、动画、布局、伸缩盒

1 3D变换 1.1 3D空间与景深 /* 开启3D空间,父元素必须开启 */transform-style: preserve-3d;/* 设置景深&#xff08;你与z0平面的距离 */perspective:50px; 1.2 透视点位置 透视点位置&#xff1a;观察者位置 /* 100px越大&#xff0c;越感觉自己边向右走并看&#xff0c;…

K8S之实现业务的蓝绿部署

如何实现蓝绿部署 什么是蓝绿部署&#xff1f;蓝绿部署的优势和缺点优点缺点 通过k8s实现线上业务的蓝绿部署 什么是蓝绿部署&#xff1f; 部署两套系统&#xff1a;一套是正在提供服务系统&#xff0c;标记为 “绿色” &#xff1b;另一套是准备发布的系统&#xff0c;标记为…

LInux系统架构----Apache与Nginx动静分离

LInux系统架构----Apache与Nginx动静分离 一.动静分离概述 Nginx的静态处理能力比较强&#xff0c;但是动态处理能力不足&#xff0c;因此在企业中常采用动静分离技术在LNMP架构中&#xff0c;静态页面交给Nginx处理&#xff0c;动态页面交给PHP-FPM模块处理。在动静分离技术…

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

HTTP/2的三大改进:头部压缩、多路复用和服务器推送

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…