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

JavaEE——线程池

目录

  • 前言
  • 1. 概念
  • 2. 线程池相关参数
  • 3. Executors的使用
  • 总结

前言

线程是为了解决进程太重的问题,操作系统中进程的创建和销毁需要较多的系统资源,用了轻量级的线程来代替部分线程,但是如果线程创建和销毁的频率也开始提升到了一定程度,系统的开销同样也不可忽视了,为了解决这种问题,我们使用了线程池进行优化。本篇文章就主要来讲讲线程池。

1. 概念

我们提前把线程创建好,放到一个”池子“里,这就构成了一个线程池,我们在申请线程时,直接从这个所谓的池子里取,用完了之后再放回去,这就是线程池的基本思想,很好的减小了创建和销毁的线程的开销。

2. 线程池相关参数

这里主要介绍一下线程池构造方法中的相关参数。
Java中提供了线程池的类:ThreadPoolExecutor,在创建这个类的实例时,有很多参数,这里来简要介绍一下:

在这里插入图片描述
官方文档中,有这四种构造方式,我们介绍第四个,其中包含了前三个的参数。
在这里插入图片描述
我们先看前两个参数:
在这里插入图片描述
第一个表示核心线程数,第二个表示总数。
在Java的线程池中,把线程分为两种:核心线程和临时线程,一创建就申请的线程是核心线程,将任务交给核心线程。若核心线程被占用满,处理不过来,就会申请一些临时的线程来进行“协助”,当空闲下来时,这些临时线程被释放,但是核心线程不会被释放。
接下来看:
在这里插入图片描述
这里第一个表示线程的存活时间,第二个表示时间单位。
通过这两个参数,来设定临时线程的存活时间。

接下来:
在这里插入图片描述
这里的参数是一个阻塞队列,存放着线程池的任务队列, 线程池就是从这个队列中取出任务,分配给其创建的线程。

继续看下一个参数:
在这里插入图片描述
这是一个线程工厂,这里的线程工厂使用了工厂设计模式,这是众多设计模式中很常见的一种,工厂模式用于弥补构造方法里存在的缺陷,比如说在创建多个构造方法的时候,如果参数的数量一致,那么参数的类型需要不同,但是实际中常常需要上述创建这种情况的构造方法,这里的参数含义不同,但是类型和数量却是一致,这样构造会编译出错。
所以为了解决这种问题,我们就引用了工厂设计模式,在这个设计模式里,我们不用构造方法来初始化对象,使用静态方法来初始化对象,即创建一个工厂类,在里面构造静态方法,来间接的达到创建对象的目的。
回到线程工厂,我们使用这个线程工厂,则是用来对线程池所创建出来的线程进行初始化的设定。

下面看最后一个参数:
在这里插入图片描述
此参数叫做拒绝策略,当线程池的任务队列满的时候,如果再次添加新任务,则会根据给出的拒绝策略来进行处理,文档提供了四种拒绝策略。
在这里插入图片描述
第一个叫做直接终止,即抛出异常,终止程序。
第二个是让调用者自己来执行任务。
第三个是丢弃队列中最老任务。
第四个是丢弃队列中最新任务。

3. Executors的使用

Executors是标准库中提供的一个线程池的简化版本,即对ThreadPoolExecutot进行了封装。
我们可以使用Executor来创建一些线程池:
在这里插入图片描述
可以看到这里有各种各样的线程池。
下面介绍四个常用的:

    public static void main(String[] args) {//固定线程数目的线程池,核心线程和最大线程数都是4ExecutorService service =  Executors.newFixedThreadPool(4);//核心线程数为0,最大线程数为Integer.MAX_VALUE的线程池ExecutorService service2 =  Executors.newCachedThreadPool();// 只有一个线程的线程池,核心线程数和最大线程数都是1ExecutorService service3 =  Executors.newSingleThreadExecutor();// “定时器”,核心线程数为0,最大线程数为10的线程池,在这个线程池的任务可以在一定时间后执行或定期执行ExecutorService service4 =  Executors.newScheduledThreadPool(10);}

一般来说我们使用最多的线程池是前两个,接下来展示如何添加任务:

        for (int i = 0; i < 100; i++) {int id = i;service.submit( new Runnable(){@Overridepublic void run() {System.out.println("线程池中的线程正在执行任务" + id);}});}

运行效果:
在这里插入图片描述

总结

以上是对线程池的一些基本介绍,希望能够让大家了解Java中线程池各参数的作用并且能够使用Executors创建常见的线程池。

http://www.lryc.cn/news/583820.html

相关文章:

  • Windows 系统 IIS 服务的重启方法
  • MyBatis-Plus 中使用 Wrapper 自定义 SQL
  • 网络安全初级
  • LeetCode经典题解:49、字母异位词分组
  • Wisdom SSH:探索AI助手在复杂运维任务中的卓越表现
  • 6 如何向量化人工智能算法
  • 低版本hive(1.2.1)UDF实现清除历史分区数据
  • hive小文件问题
  • RabbitMQ 消息队列:从入门到Spring Boot实战
  • MySQL(127)如何解决主从同步失败问题?
  • XMAPP MySQL 启动后自动停止
  • adb 简介与常用命令
  • 线上事故处理记录
  • mx6ull-裸机学习实验15——RTC 实时时钟实验
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程
  • MySQL断开连接后无法正常启动解决记录
  • 第一次搭建数据库
  • 壁仞 k8s 兼容
  • 力扣hot100速通(7.9)|49.字母异位词分组 128.最长连续序列 283.移动零 11.盛最多水的容器 42.接雨水
  • Swift 图论实战:DFS 算法解锁 LeetCode 323 连通分量个数
  • 力扣面试150题--全排列
  • leetcode 3440. 重新安排会议得到最多空余时间 II 中等
  • Leetcode力扣解题记录--第42题 接雨水(动规和分治法)
  • 图解LeetCode:79递归实现单词搜索
  • 【LeetCode100】--- 1.两数之和【复习回滚】
  • 力扣-73.矩阵置零
  • 力扣-54.螺旋矩阵
  • 每天一个前端小知识 Day 29 - WebGL / WebGPU 数据可视化引擎设计与实践
  • C++11 std::is_sorted 和 std::is_sorted_until 原理解析
  • 邀请函 | 知从科技邀您共赴2025 RISC-V 中国峰会