java中的线程池有哪些,分别有什么作用?

article/2025/9/14 17:09:00

阅读完本篇文章会知道如下三点:

1.进程-线程简单介绍

2.java的线程池是什么,有哪些类型,作用分别是什么

3.使用线程池的优点

 

1.进程-线程的简单介绍

进程

什么是进程呢?

进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的调度的基本单位,是操作系统结构的基础。简单来讲:进程是指运行中的应用程序,进程是一个实体,每一个进程都有它自己的地址空间。例如我们点击了QQ,就启动了一个进程,操作系统就会为这个进程分配独立的地址空间,当我们又点击浏览器,这样又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。

线程

什么是线程呢?

线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少有一个线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。注意:线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源,线程有就绪,阻塞,运行三种基本状态。

另外:在Unix System和SunOS中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。

2.java的线程池是什么,有哪些类型,作用分别是什么

线程池是一种多线程处理形式,处理过程中将任务添加队列,然后在创建线程后自动启动这些任务,每个线程都使用默认的堆栈大小,以默认的优先级运行,并处在多线程单元中,如果某个线程在托管代码中空闲,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后辅助线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才能启动。

java里面的线程池的顶级接口是Executor,Executor并不是一个线程池,而只是一个执行线程的工具,而真正的线程池是ExecutorService

java中的有哪些线程池?

1.newCachedThreadPool创建一个可缓存线程池程

2.newFixedThreadPool 创建一个定长线程池

3.newScheduledThreadPool 创建一个周期性执行任务的线程池

4.newSingleThreadExecutor 创建一个单线程化的线程池

下面一一分析:

1.newCachedThreadPool,是一种线程数量不定的线程池,并且其最大线程数为Integer.MAX_VALUE,这个数是很大的,一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。但是线程池中的空闲线程都有超时限制,这个超时时长是60秒,超过60秒闲置线程就会被回收。调用execute将重用以前构造的线程(如果线程可用)。这类线程池比较适合执行大量的耗时较少的任务,当整个线程池都处于闲置状态时,线程池中的线程都会超时被停止。

实例代码:

public class PoolExecutorTest {public static void main(String[] args) {// TODO Auto-generated method stubExecutorService mCachelThreadPool = Executors.newCachedThreadPool();for(int i = 0;i < 7;i++ ) {final int index = i;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}mCachelThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("第" +index +"个线程" +Thread.currentThread().getName()); }});}}}

输出结果:

从结果可以看到,执行第二个任务的时候第一个任务已经完成,会复用执行第一个任务的线程,不用每次新建线程。

2.newFixedThreadPool 创建一个指定工作线程数量的线程池,每当提交一个任务就创建一个工作线程,当线程 处于空闲状态时,它们并不会被回收,除非线程池被关闭了,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列(没有大小限制)中。由于newFixedThreadPool只有核心线程并且这些核心线程不会被回收,这样它更加快速底相应外界的请求。

实例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置最大线程数5个ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(5);for(int i = 0;i < 7;i++ ) {final int index = i;mFixedThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("时间是:"+System.currentTimeMillis()+"第" +index +"个线程" +Thread.currentThread().getName()); try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}	}});}}}

输出结果:

由于设置最大线程是5,所以当执行完这5个线程后,等待两秒后,在执行后面2个线程。

3.newScheduledThreadPool 创建一个线程池,它的核心线程数量是固定的,而非核心线程数是没有限制的,并且当非核心线程闲置时会被立即回收,它可安排给定延迟后运行命令或者定期地执行。这类线程池主要用于执行定时任务和具有固定周期的重复任务。

延迟执行实例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置池中核心数量是2ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  System.out.println("现在的时间:"+System.currentTimeMillis());mScheduledThreadPool.schedule(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("现在的时间:"+System.currentTimeMillis());}}, 4, TimeUnit.SECONDS);//这里设置延迟4秒执行}}

执行的结果如下:

误差可以忽略,实际结果确实延迟了4秒执行。

定期执行示例代码

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stub//设置池中核心数量是2ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  System.out.println("现在的时间:"+System.currentTimeMillis());mScheduledThreadPool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("现在的时间:"+System.currentTimeMillis());}}, 2, 3,TimeUnit.SECONDS);//这里设置延迟2秒后每3秒执行一次}}

执行的结果如下:

可发现确实延迟2秒后每隔3秒后就会执行一次,程序不退出就一直执行下去。

4.newSingleThreadExecutor这类线程池内部只有一个核心线程,以无界队列方式来执行该线程,这使得这些任务之间不需要处理线程同步的问题,它确保所有的任务都在同一个线程中按顺序中执行,并且可以在任意给定的时间不会有多个线程是活动的。

示例代码:

public class PoolExecutorTest {public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubExecutorService mSingleThreadPool = Executors.newSingleThreadExecutor();     for(int i = 0;i < 7;i++) {final int number = i;mSingleThreadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println("现在的时间:"+System.currentTimeMillis()+"第"+number+"个线程");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}});}}}

执行的结果如下:

可发现是有顺序地去执行上面6个线程。

3.使用线程池的优点

1.重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销

2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞

3.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能

关注微信公众号,一面技术一面艺术


http://chatgpt.dhexx.cn/article/cfjt3jqJ.shtml

相关文章

线程池有几种创建方式?

总体来说线程池的创建可以分为以下两类&#xff1a; 通过 ThreadPoolExecutor 手动创建线程池通过 Executors 执行器自动创建线程池。 而以上两类创建线程池的方式&#xff0c;又有 7 种具体实现方法&#xff0c;这 7 种实现方法分别是&#xff1a; Executors.newFixedThre…

创建线程池有哪几种方式

通常开发者都是利用Executors提供的通用线程池创建方法&#xff0c;去创建不同配置的线程池&#xff0c;主要区别在于不同的 Executors目前提供了5种不同的线程池创建配置&#xff1a; 1、newCachedThreadPool&#xff08;&#xff09;&#xff0c;它是用来处理大量短时间工作…

Java常见的5种线程池

在开发过程中我们常常需要使用到多线程来提高我们代码处理某些任务的效率&#xff0c;最基本的两种创建多线程的方式分别是继承Thread类和实现Runnable接口。但是创建线程和销毁线程的系统开销比较大&#xff0c;而且过多的线程会占用过多的内存等资源。在《阿里巴巴Java开发手…

4种常用线程池介绍

一. 线程池简介 1. 线程池的概念&#xff1a; 线程池就是首先创建一些线程&#xff0c;它们的集合称为线程池。使用线程池可以很好地提高性能&#xff0c;线程池在系统启动时即创建大量空闲的线程&#xff0c;程序将一个任务传给线程池&#xff0c;线程池就会启动一条线程来执…

面试突击:线程池有几种创建方式?推荐使用哪种?

在 Java 语言中&#xff0c;并发编程都是通过创建线程池来实现的&#xff0c;而线程池的创建方式也有很多种&#xff0c;每种线程池的创建方式都对应了不同的使用场景&#xff0c;总体来说线程池的创建可以分为以下两类&#xff1a; 通过 ThreadPoolExecutor 手动创建线程池。…

线程池的分类(5种)

Java面试高频提问点 问题一&#xff1a;线程池的创建方式 文章目录 Java面试高频提问点前言一、线程池的分类1.newCachedThreadPool2.newFixedThreadPool3.newSingleThreadExecutor4.newScheduleThreadPool5.newSingleThreadScheduledExecutor 总结 前言 近期因为上海疫情原因…

docker搭建pxc

1、设置阿里云加速器 先搭建一个加速器为后面下载镜像做准备 2、下载pxc镜像 docker pull percona/percona-xtradb-cluster:5.7.21 #下载镜像 docker tag percona/percona-xtradb-cluster:5.7.21 pxc #改镜像名 docker rmi percona/percona…

mysql bootstrap pxc_MYSQL PXC

下载ssl101的安装包上传服务器对应安装目录/usr/local 目录。 [rootlocalhost ~]# yum -y install openssl openssl-devel perl-Time-HiRes perl-DBD-MySQL.x86_64 perl-IO-Socket-SSL.noarch [rootpxc2 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm warning: libev-4.15…

mysql pxc集群介绍_PXC集群的概述及搭建

PXC集群的概述及搭建 PXC集群的简介 Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。PXC集群以节点组成(推荐至少3节点&#xff0c;便于故障恢复&#xff0c;后面会讨论两节点的情况)&#xff0c;每个节点都是基于常规的 MySQL/Percona Server&…

pxc 数据库

一 首先 拉取pxc镜像 docker pull percona/percona-xtradb-cluster 重命名pxc名字 docker tag percona/percona-xtradb-cluster pxc 删除之前的 docker rmi percona/percona-xtradb-cluster 二 创建内部网络 docker network create --subnet172.18.0.0/24 net1 查看net1网…

MySQL_PXC集群_综合应用

MySQL_PXC集群_综合应用 简述部署PXC集群和主从区别综合应用部署PXC集群部署主从复制集群MasterSlave 部署MyCat节点一节点二 部署HAProxy 简述 Percona XtraDB Cluster&#xff08;简称PXC&#xff09;是针对MySQL用户的高可用性和扩展性解决方案&#xff0c;基于Percona Ser…

mysql pxc 使用_PXC使用介绍

用户发起Commit&#xff0c;在收到Ok之前 集群每次发起一个动作&#xff0c;都会有一个唯一的编号 PXC独有的Global Trx Id 动作发起者: commit_cb其它节点多了一个动作&#xff1a; apply_cb 上面的这些动作&#xff0c;是通过那个端号交互的&#xff1f;4567 4568端口 IST 只…

docker搭建pxc集群

因为公司需要搭建mysql集群&#xff0c;本来使用原生的mysql镜像搭建了一个简单的主从集群&#xff0c;后来发现使用pxc集群更加方便快捷&#xff0c;而且数据同步性能更强&#xff0c;所以尝试搭建一个pxc集群。 1.pxc介绍 Percona XtraDB Cluster&#xff08;PXC集群&#…

mysql gtid 还是pxc_PXC中的GTIDs

基本环境&#xff1a;PXC 5.7.19 RowGtid&#xff0c;3节点 一、Galera GTID vs MySQL GTID 1.1、Galera GTID vs MySQL GTID Both kinds of GTIDs are using the same format: . For Galera, is generated when the cluster is bootstrapped. This is shared by all nodes. Fo…

mysql pxc搭建_MySQL(PXC)集群搭建

前言 我这里使用三台CentOS Linux release 7.8.2003的虚拟机来作演示 [rootn1 ~]# cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core) 安装前准备 请确保服务器没有安装MySQL&#xff0c;如果已经安装了请先卸载(后面会起冲突) 删除 MariaDB 这里我的服务器版本为…

docker pxc mysql_docker安装pxc集群的详细教程

前言 现在mysql自建集群方案有多种&#xff0c;keepalived、MHA、PXC、MYSQL主备等&#xff0c;但是目前根据自身情况和条件&#xff0c;选择使用pxc的放来进行搭建&#xff0c;最大的好处就是&#xff0c;多主多备&#xff0c;即主从一体&#xff0c;没有同步延时问题&#xf…

mysql pxc gcache_MySQL高可用之PXC

PXC简介 PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。他将Percona Server和XtraBackup与Galera库集成&#xff0c;以实现同步多主复制。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster&#xff0c;目前PXC架构在生产线上用的更…

PXC集群

1.pxc集群 1.1 软件介绍 • Percona XtraDB Cluster(简称PXC) - 是基于Galera的mysql高可用集群解决方案 - Galera Cluster是Codership公司开发的一套免费开源的高可用方案 - PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(同步,多主复制…

mysql bootstrap pxc_Mysql高可用之PXC

一。PXC简介 Percona XtraDB Cluster简称PXC。是一套开源mysql高可用解决方案(XtraDb是mysql被oracle收购之前 开源一个分支 其他分支还有mariadb)&#xff0c;Percona Xtradb Cluster的实现是在原mysql代码上通过Galera包将不同的mysql实例(新名称 Percona Server)连接起来&am…

mysql pxc 安装_MYSQL PXC 集群安装

名词介绍&#xff1a; WS&#xff1a;write set写数据集 IST: Incremental State Transfer增量同步 SST&#xff1a;State Snapshot Transfer全量同步 1.准备环境 1.1 centos 7系统,三台主机 IP分别为&#xff1a;192.168.80.163&#xff1b;192.168.80.167&#xff1b;192.168…