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

news2024/9/28 9:30:39

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

目录

引言

一、实现多线程

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.coloradmin.cn/o/1506847.html

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

相关文章

WPF(1)的MVVM的数据驱动学习示例

MVVM Model:数据模型、View 界面、ViewModel 业务逻辑处理 项目结构 界面数据绑定 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/x…

opencv人脸识别实战3:多线程和GUI界面设计(PyCharm实现)

一、多线程设计 1、在一个新线程中调用了 scan_face() 函数来进行人脸识别操作。根据识别结果&#xff0c;更新界面显示结果&#xff0c;最后释放资源。 def f_scan_face_thread():var.set(刷脸)ans scan_face()if ans 0:print("最终结果&#xff1a;无法识别")va…

C++ 中的头文件和源文件

#include<>一般用于包含系统头文件&#xff0c;诸如stdlib.h、stdio.h、iostream等&#xff1b; 类库目录下查找失败&#xff0c;编译器会终止查找&#xff0c;直接报错&#xff1a;No such file or directory. #include""一般用于包含自定义头文件&#xff…

NLP 算法实战项目:使用 BERT 进行模型微调,进行文本情感分析

本篇我们使用公开的微博数据集(weibo_senti_100k)进行训练&#xff0c;此数据集已经进行标注&#xff0c;0: 负面情绪&#xff0c;1:正面情绪。数据集共计82718条(包含标题)。如下图&#xff1a; 下面我们使用bert-base-chinese预训练模型进行微调并进行测试。 技术交流&#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件&#xff0c;用于将数据展示为环形图表。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明&#xff1a; 建议使用文本组件构建当前数值文本和辅…

信息系统项目管理师005:工业互联网(1信息化发展—1.2现代化基础设施—1.2.2工业互联网)

文章目录 1.2.2 工业互联网1.内涵和外延2.平台体系3.融合应用 记忆要点总结 1.2.2 工业互联网 工业互联网(Industrial Internet)是新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态&#xff0c;通过对人、机、物、系统等的全面连接&#xff0c;构建起覆…

【EDK II】作为UEFI的实现,EDK II 的架构是什么样的

目录 前言 EDK II 架构 配置文件 结语 前言 基本输入输出系统 (Basic Input Output System, BIOS) 最早由 IBM&#xff08;International Business Machines Corporation) 公司于1981年提出并开发&#xff0c;后来成为个人计算机(PC)的标准固件接口。但受限于传统BIOS (Le…

Git分支管理(IDEA)

文章目录 Git分支管理&#xff08;IDEA&#xff09;1.Git分支管理&#xff08;IDEA&#xff09;1.基本介绍1.分支理解2.示意图 2.搭建分支和合并的环境1.创建Gitee仓库2.创建普通maven项目3.克隆Gitee项目到E:\GiteeRepository4.复制erp文件夹下的内容到IDEA项目下5.IDEA项目中…

Kafka的分区机制

Kafka的分区机制是其核心功能之一&#xff0c;旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理&#xff1a; Kafka分区基本概念 分区&#xff08;Partition&#xff09;&#xff1a;Kafka中的主题&#xff08;Topic&#xff09;可以细分为多个分区…

软件测试APP完整测试作业流程(附流程图),公司级软件测试流程化办公

目录 1. 概述 2. 软件测试流程 3. 软件测试周期人员活动图 4. 总结 1. 概述 1.1 目的 有效的保证软件质量&#xff1b; 有效的制定不同测试类型&#xff08;软件系统测试、音频主观性测试、Field Trial、专项测试、自动化测试、性 能测试、用户体验测试&#xff09;的软件…

【HarmonyOS】ArkUI - 自定义卡片样式

ArkUI - 自定义卡片样式 HarmonyOS API 9 没有提供原生的卡片样式&#xff0c;我定义了一个卡片样式&#xff0c;可以方便大家在日常开发中使用。 效果图&#xff1a; 卡片样式代码如下&#xff1a; Styles function card() {.width(95%).padding(20).backgroundColor(Col…

【CSP】2022-03-2 出行计划 经典差分和前缀和 (包含完整思路、代码和写代码过程中遇到的问题)

2022-03-2 出行计划 差分和前缀和 2022-03-2 出行计划 差分和前缀和思路遇到的问题&#xff08;不小心出现的细节问题&#xff09;完整代码 2022-03-2 出行计划 差分和前缀和 这题很久之前做过一次&#xff0c;现在已经基本忘记了&#xff0c;所以重新做一遍&#xff0c;然后一…

Linux动态追踪——ftrace

目录 摘要 1 初识 1.1 tracefs 1.2 文件描述 2 函数跟踪 2.1 函数的调用栈 2.2 函数调用栈 2.3 函数的子调用 3 事件跟踪 4 简化命令行工具 5 总结 摘要 Linux下有多种动态追踪的机制&#xff0c;常用的有 ftrace、perf、eBPF 等&#xff0c;每种机制适应于不同的场…

银河麒麟V10 安装部署大数据管理软件 DataSophon

一、概览 1、愿景 致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助您快速构建起稳定、高效、可弹性伸缩的大数据云原生平台。 2、DataSophon是什么 《三体》&#xff0c;这部获世界科幻文学最高奖项雨果奖的作品以惊艳的"硬科幻"…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(一)

前言 Jmeter&#xff0c;Postman一些基本大家相比都懂。那么真实在项目中去使用&#xff0c;又是如何使用的呢&#xff1f;本文将一文详解jmeter接口测试 一、接口测试分类 二、目前接口架构设计 三、市面上的接口测试工具 四、Jmeter简介&#xff0c;安装&#xff0c;环境…

【Kafka系列 08】生产者消息分区机制详解

一、前言 我们在使用 Apache Kafka 生产和消费消息的时候&#xff0c;肯定是希望能够将数据均匀地分配到所有服务器上。 比如很多公司使用 Kafka 收集应用服务器的日志数据&#xff0c;这种数据都是很多的&#xff0c;特别是对于那种大批量机器组成的集群环境&#xff0c;每分…

Visio无空白无黑边导出PDF

步骤1 文件->选项->自定义功能区->勾选开发工具 步骤2 开发工具->显示ShapeSheet->页->将Print Properties中的Margin都设置为0 步骤3 设计->大小->适应绘图 步骤4 导出PDF->选项->取消勾选【辅助功能文档结构标记】->发布

BetterDisplay for mac V2.2.5 强大的mac显示器管理开源工具

BetterDisplay是Mac OS 一个很棒的工具&#xff01; 它允许您将显示器转换为完全可扩展的屏幕 管理显示器配置覆盖 允许亮度和颜色控制 提供 XDR/HDR 亮度升级&#xff08;Apple Silicon 和 Intel Mac 上兼容的 XDR 或 HDR 显示器的额外亮度超过 100% - 多种方法可用&#x…

opengl 学习(三)-----纹理

纹理就是贴图 分类前提demo效果解析 分类 前提 需要使用一个库来处理图片&#xff1a;#include <stb_image.h> https://github.com/nothings/stb 你下载好了之后&#xff0c;把目目录包含了就好 然后再引入 #define STB_IMAGE_IMPLEMENTATION #include "stb_i…

鸿蒙开发学习:【ets_frontend组件】

简介 ets_frontend组件是方舟运行时子系统的前端工具&#xff0c;结合ace-ets2bundle组件&#xff0c;支持将ets文件转换为方舟字节码文件。 ets_frontend组件架构图 目录 /arkcompiler/ets_frontend/ ├── test262 # test262测试配置和运行脚本 ├── testTs…