当前位置: 首页 > article >正文

Java中线程池的介绍、构造方法及优势

前言

在Java应用程序开发中,使用线程池能够有效地控制线程的数量,提升系统的性能,减少资源浪费。本文将介绍线程池的概念、优势、以及线程池的构造方法和类型,并逐一讲解线程池构造参数的使用,包含具体代码案例。

线程池介绍

线程池是一种线程对象池,其中包含了多个线程,可以在运行时动态地分配和回收线程。线程池会将来自应用程序的任务分配给池中可用的线程,避免了每次请求都需要创建新线程的开销。

线程池优势

线程池的优势主要有以下几点:

  • 重用现有的线程对象,避免了线程对象的频繁分配和销毁,减小了系统资源的消耗;
  • 控制运行线程的数量,避免因创建过多线程造成系统的过度开销和负载过高;
  • 能够提升系统响应速度和服务质量,保证了应用程序的性能和可靠性。

线程池的构造方法及类型

Java中通过 Executor 框架提供了线程池的标准实现。在构造线程池的时候,常用的方式有以下几种:

newFixedThreadPool

该方法返回一个固定大小的线程池,可以控制最大并发线程数。

public static ExecutorService newFixedThreadPool(int nThreads)

newCachedThreadPool

该方法返回一个可根据实际情况调整线程数量的线程池,不限制最大线程数,当执行新任务时,若线程池中有空闲线程,则直接使用空闲线程执行任务,否则创建新线程执行任务。

public static ExecutorService newCachedThreadPool()

newSingleThreadExecutor

该方法返回只有一个线程的线程池,它的核心池大小为1,最大池大小为1,只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO、LIFO、优先级)执行。

public static ExecutorService newSingleThreadExecutor()

newScheduledThreadPool

该方法返回一个具有定时功能的线程池。

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)

线程池构造参数逐一讲解

在构造线程池的时候,需要传入相应的参数,以下是各种线程池的构造参数逐一讲解。

corePoolSize

线程池中的核心线程数,表示当前池中存在的线程数,即使当前线程空闲也不会被回收。默认情况下,在创建线程池时线程没有立即启动,而是在任务提交到线程池时再启动。

maximumPoolSize

线程池中的最大线程数,当核心线程都出于忙碌状态时,会创建新的线程来处理任务,直到达到最大线程数为止。

keepAliveTime

非核心线程闲置超时时间,当线程池中的线程数大于核心线程数时,如果这些线程都处于空闲状态,则这些线程会被回收。具体时间的计算方式为线程池中的线程数量减去核心线程数,这部分线程的空闲时间达到 keepAliveTime 时会被回收。

unit

表示 keepAliveTime 的时间单位,包括天、小时、分钟、秒、毫秒、微秒和纳秒等。

workQueue

任务队列,被提交但未被执行的任务。

threadFactory

线程工厂,用来创建线程。

handler

线程饱和策略,当线程池中的线程数达到 maximumPoolSize,且队列已满时,采取的饱和策略。常用的饱和策略有AbortPolicy、DiscardPolicy、DiscardOldestPolicy 和 CallerRunsPolicy 等。

具体代码案例

接下来,我们将以 newFixedThreadPool 方法为例,给出具体的代码实现方式。

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 创建一个大小为 5 的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            // 提交任务
            executor.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "正在执行任务");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "任务执行完成");
            });
        }
        // 关闭线程池
        executor.shutdown();
    }
}

上述代码是创建一个大小为5的线程池,提交10个任务,每个任务中线程会休眠1秒钟后再输出消息并结束。最后调用 shutdown() 方法关闭线程池。

结论

线程池可以提高系统的性能和可靠性,避免了线程的频繁创建和销毁,减少了系统资源的消耗。在构造线程池的时候,需要传入一些参数,包括核心线程数、最大线程数、任务队列、饱和策略等。Java中提供了多种线程池实现,例如 newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPool 等,开发者可根据实际情况进行选择和使用。


http://www.kler.cn/news/17012.html

相关文章:

  • 电子工程师是怎么练成的
  • 数据结构与算法之链表: Leetcode 141. 环形链表 (Typescript版)
  • 谷粒商城二十四Sentinel限流熔断降级
  • 用于scATAC-seq有监督分类的Cellcano
  • 【LeetCode刷题记录】数组专题
  • Python小姿势 - Python面向对象
  • 《基于深度学习模型的非接触式面部视频记录技术用于心房颤动的检测》阅读笔记
  • 「Codeforces」B. Avoid Local Maximums
  • Redis之五大基本的数据类型:字符串String 散列hashes 列表 lists 集合sets 有序集合sorted sets 基础命令讲解
  • 学生台灯什么牌子好对眼睛好?专业护眼灯的学生台灯分享
  • 【AI工具】bing chat 使用--三种模式+撰写功能
  • gradle Task 详解
  • 什么是Filter?
  • 工具及方法 - 安装播放器pot player
  • 大二一个学期学这么点内容,没有概念,只有实操
  • TCP的三次握手和四次挥手
  • 冲浪杂记——
  • Apollo 7.0——percception:rader源码剖析
  • win11本地安全机构保护已关闭怎么办?如何修复windows11本地安全机构保护已关闭?
  • ubuntu: ubuntu22.04安装redis数据库,并设置开机自启动
  • Redis底层设计与源码分析(一)__底层数据结构逻辑分析
  • 低代码,一招制敌,解决职场人的的办公难题
  • 【热门框架】Maven中聚合,继承指的是什么?有什么作用?
  • 刚转岗做项目经理,无从下手,怎么办?
  • 【硬件】嵌入式电子设计基础之分析电路
  • 视频转gif如何做?三步教你视频转gif制作
  • ClickHouse的资料
  • JetBrains 公布 WebStorm 2023.2 路线图
  • 软件测试技术(四)白盒测试
  • 五面阿里Java岗,从小公司到阿里的面经总结