深入理解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. 提高系统的响应速度:通过合理配置线程池的大小和类型,可以更好地响应用户的请求,提高系统的响应速度。

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

         

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出计算机网络 day.1 概论③ 电路交换、分组交换和报文交换

人无法同时拥有青春和对青春的感受 —— 04.3.9 内容概述 01.电路交换、分组交换和报文交换 02.三种交换方式的对比 一、电路交换、分组交换和报文交换 1.电路交换 计算机之间的数据传送是突发式的&#xff0c;当使用电路交换来传送计算机数据时&#xff0c;其线路的传输效率一…

构建可靠的数据基础:HDFS的架构优势与基本操作

目录 写在前面一、 HDFS概述1.1 HDFS简介1.2 HDFS优缺点1.2.1 优点1.2.2 缺点 1.3 HDFS组成架构1.4 HDFS文件块大小 二、HDFS的Shell操作&#xff08;开发重点&#xff09;2.1 基本语法2.2 命令大全2.3 常用命令实操2.3.1 上传2.3.2 下载2.3.3 HDFS直接操作 三、HDFS的API操作3…

代码随想录算法训练营第四十六天| 139.单词拆分、背包总结

文章目录 1.单词拆分[2.背包总结] 1.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1…

使用VBA快速梳理多层级族谱(组织架构)

实例需求&#xff1a;族谱&#xff08;或者公司组织架构等&#xff09;都是典型的带有层级关系数据&#xff0c;例如下图中左侧表格所示。 A列为层级&#xff08;准确的讲是B列成员的层级&#xff09;&#xff0c;从一开始递增B列和C列为成员直接的父&#xff08;/母&#xff…

项目解决方案:视频监控接入和录像系统设计方案(下)

目 录 1.概述 2. 建设目标及需求 2.1建设总目标 2.2 需求描述 ​2.3 需求分析 3.设计依据与设计原则 3.1设计依据 3.2 设计原则 4.建设方案设计 4.1系统方案设计 4.2组网说明 5.产品介绍 5.1视频监控综合资源管理平台介绍 5.2视频录像服务器和存储 5.2.…

PostgreSQL中In, Exists在SQL查询中到底有无区别

前言 SQL查询当中&#xff0c;In和Exists子查询到底有无区别&#xff1f;记得很多年以前&#xff0c;确实是有相关的使用戒条的&#xff0c;或者说存在一些使用的惯用法。试图完全抹开两者的区别&#xff0c;就有点过了。 两者的主要区别&#xff1a; 从目的上讲&#xff0c…

数据库create详细用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 本篇文章主要以kingbase为例介绍创建表的基本语法、使用案例和添加描述等方法&#xff0c;在目录2、目录3再详细介绍数据类型和列级约束。 文章目录如下 1. 基本用法 1.1. 基础语法 1.2. 基础案例 1.3. 添加描述 …

防御保护作业六

实验拓扑图&#xff1a; 配置过程&#xff1a; FW1 自定义服务ike 创建nat策略&#xff0c;让10.0.2.0/24访问192.168.1.0/24的流量不进行nat转换,并将这条策略置于nat策略最上面&#xff0c;优先匹配 FW3 测试

vmware添加新磁盘

文章目录 前言一、新增磁盘二、初始化磁盘1.查看2.初始化3.挂载 总结 前言 虚拟机磁盘空间很散乱&#xff0c;大部分都在/root和/home下不好操作&#xff0c;故考虑新增磁盘、增加挂载点。 一、新增磁盘 右键打开虚拟机设置 二、初始化磁盘 1.查看 fdisk -l2.初始化 …

基于SpringBoot在线考试系统

基于SpringBootHtmlJavascript css 的在线考试系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 一、项目背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内…

Java 学习和实践笔记(33):多态详解

多态&#xff08;polymorphism): 不同的对象&#xff0c;调用同一个方法&#xff0c;对象的行为状态可能完全不同&#xff0c;也就是说&#xff0c;有多种状态&#xff0c;这种情况就叫做多态。 以下的例子里&#xff0c;同样都是人吃饭这个方法&#xff0c;但是不同的人使用吃…

【SpringBoot框架篇】36.整合Tess4J搭建提供图片文字识别的Web服务

文章目录 简介文件下载引入依赖main函数中使用基于Springboot搭建OCR Web服务配置traineddata路径枚举用到的语种类型定义接口响应的json数据格式封装OCR服务引擎编写web提供服务的接口启动服务并且测试html demo扩展 项目配套代码 简介 Tess4J是一个基于Tesseract OCR引擎的J…

网上超市系统|基于Springboot的网上超市系统设计与实现(源码+数据库+文档)

网上超市系统目录 目录 基于Springboot的网上超市系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、用户管理 1、 商品信息 2、购物车 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

重要通告 | 公司更名为“浙江实在智能科技有限公司”

更名公告 升级蜕变、砥砺前行 因业务快速发展和战略升级&#xff0c;经相关政府机构批准&#xff0c;自2024年3月1日起&#xff0c;原“杭州实在智能科技有限公司”正式更名为“浙江实在智能科技有限公司”。 更名后&#xff0c;公司统一社会信用代码不变&#xff0c;业务主体…

力扣hot100:152.乘积最大子数组(动态规划)

一个子数组问题&#xff0c;我们要使用线性dp&#xff0c;最好先考虑以i结尾&#xff0c;如果定义dp[i]为前i个数最大子数组乘积值 那么dp[i-1]就无法转移到dp[i]。因此我们先考虑dp[i]定义为以第i个数结尾的最大子数组乘积值。 53. 最大子数组和 最大子数组和是一个动态规划问…

b树(一篇文章带你 理解 )

目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…

yolov5体验

无须安装CUDA&#xff0c;只需要有NVIDIA图形驱动即可 1. 安装Miniconda miniconda下载地址 1.1 安装细节 一个对勾都不要选择 1.2 配置环境变量 在环境变量Path中添加如下变量 C:\Server\miniconda C:\Server\miniconda\Scripts C:\Server\miniconda\Library\bin2. …

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

mysql题库详解

1、如何创建和删除数据库&#xff1f; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 drop database 数据库名; 2、MyISAM与InnoDB的区别&#xff1f; 1&#xff09;事务&#xff1a;MyISAM 不支持事务 InnoDB 支持 2&#xff09;行锁/表锁&#xff1a;MyISAM 支持表级锁…

冒险和预测

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第十篇,在这里分享给大家,还有一些书籍《深入理解计算机系统》&#xff0c;《计算机体系结构&#xff1a;量化研究方法》&#xff0c;这篇文章讲冒险和预测 流水线设计需要解决的三大冒险&#xff0c;分别是结…