Executors提供的四种线程池

聊聊 ThreadPoolExecutor 线程池及其源码 在我们的实际开发中,通常使用线程池创建线程资源。而线程池本质上是一种池化技术,利用资源复用的思想,复用线程资源。 阅读详情

1、newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

使用方法:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

底层实现:

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}

通过看其实现可以发现,他实际上是创建一个核心池为0,最大线程为MAX_VALUE的线程池,该线程池使用SynchronousQueue队列。每次添加任务若没有空闲的线程都会创建新的线程去执行。

使用demo:

@Test
public void test_newCachedThreadPool() throws InterruptedException{
	ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
	for (int i = 0; i < 10; i++) {
		final int index = i;
		cachedThreadPool.execute(new Runnable() {
			public void run() {
				try {
					Thread.sleep(index * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName());
			}
		});
	}
	Thread.sleep(100000L);
}

运行结果:

可以看到只有一次复用了线程。其他时候都是新创建一个线程执行。
在这里插入图片描述


2、newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

使用方法:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

底层实现:

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}

通过看其实现可以发现,他实际上是创建一个核心池、最大线程都为nThreads的固定线程数量的线程池,keepAliveTime为0,标识线程永久存活。该线程池使用LinkedBlockingQueue基于链表的队列,最大长度为Integer.MAX_VALUE。

使用demo:

@Test
public void test_newFixedThreadPool() throws InterruptedException{
	ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
	for (int i = 0; i < 10; i++) {
		final int index = i;
		fixedThreadPool.execute(new Runnable() {
			public void run() {
				try {
					Thread.sleep(index * 1000);
				} catch (InterruptedException e) {
				}
				System.out.println(index + " : "+Thread.currentThread().getName());
			}
		});
	}
	Thread.sleep(100000L);
}

运行结果:

从运行结果可以看到,最多只创建了3个线程。去进行任务处理。
在这里插入图片描述


3、newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。

对于newScheduledThreadPool 的使用和讲解



4、newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

newFixedThreadPool(1)和newSingleThreadExecutor的区别

Unlike the otherwise equivalent {@code newFixedThreadPool(1)} the returned executor is guaranteed not to be reconfigurable to use additional threads.

newFixedThreadPool(1)在功能上可以实现newSingleThreadExecutor,但是其区别是使用newSingleThreadExecutor,返回的对象是禁止修改的。比如说,通过返回的对象重新设置核心线程池大小。

例如下面的例子,将newFixedThreadPool的核心池由2改为5,同样的做法,使用newSingleThreadExecutor则会报错。:
在这里插入图片描述

使用方法:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

底层实现:

public static ExecutorService newSingleThreadExecutor() {
	return new FinalizableDelegatedExecutorService
		(new ThreadPoolExecutor(1, 1,
								0L, TimeUnit.MILLISECONDS,
								new LinkedBlockingQueue<Runnable>()));
}

通过看其实现可以发现,他实际上是先创建一个核心池、最大线程都为1的固定线程数量的线程池,keepAliveTime为0,标识线程永久存活。该线程池使用LinkedBlockingQueue基于链表的队列,最大长度为Integer.MAX_VALUE。然后对这个线程池对象进行封装。

使用demo:

@Test
public void test_newSingleThreadExecutor() throws InterruptedException{
	ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
	for (int i = 0; i < 10; i++) {
		final int index = i;
		singleThreadExecutor.execute(new Runnable() {
			public void run() {
				try {
					System.out.println("按先进先出的顺序执行:"+index);
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
	}
	Thread.sleep(100000L);
}

运行结果:

可以看到,是按照任务的添加顺序执行的在这里插入图片描述


05-Java通过Executors提供四种线程池 Java通过Executors提供四种线程池,分别为: 1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 3. newScheduledThreadPool 创建一个定长线程池,支持定时及周 阅读详情

相关推荐

单细胞转录组数据分析全流程:从原始数据到细胞注释

本文详细介绍了单细胞转录组数据分析的全流程,从原始数据读取、环境搭建、数据质控与标准化,到降维聚类、细胞类型注释,以及高级质控与多样本整合。重点阐述了如何利用Seurat等工具进行数据处理,并通过标志基因比对与自动注释方法完成细胞身份鉴定,为研究者提供了一套清晰、可操作的分析指南。

coffee的博客 553

java executor 四种_Executors提供四种线程池

Java通过Executors提供四种线程池,分别为:1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需求,可以灵活回收空闲线程,若无可回收则新建线程。2、newFixedThreadPool创建一个定长线程池,可以控制线程最大并发数,超过的线程会在队列中等待。3、newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。4、n...

weixin_39555715的博客 973

【深度学习】手把手教你在远程服务器上跑 YOLOv3 相关代码(含环境配置)

这篇文章主要记录了如何配置项目环境以及如何在远程服务器上跑 YOLOv3 模型。

作者正在煮茶中... 2383

线程池详解

在Android开发中,如果我们要执行某个耗时任务,一般都会考虑开启一个线程去处理。 因为我们都知道一个线程run方法执行完毕后,才算真正结束,但是,这只是结束,并没有被回收,会一直闲置在那里,等待GC去回收,所以如果每执行一个任务,我们都new一个线程,那么在某些极端的场景下,是比较消耗内存的。 这篇文章先简单介绍下Android中自带的四种线程池: newCachedThreadPool:创建

sunzhi_的博客 360

Python 爬取新浪财经 7x24(1): 下载数据

前言 最近在做一个需要很多财经数据的项目。于是想到可不可以通过爬虫来解决(尝试白嫖)。 提供财经数据的网站有很多个,其中比较靠谱和更新比较及时的应该是新浪7x24 live数据。 http://finance.sina.com.cn/7x24/?tag=0 这个问题有一定的难度,因为这个网页是动态加载的。每一次只会加载部分数据,而只有拉到底部才可以加载新的数据。 于是乎,我们要做的事情是: 下载数据 保存到数据库 本篇介绍如何下载数据。 代码 闲言少叙书归正文,代码的实现如下: import reque

ZJ_11701的博客 2905

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1034

多线程基础(九)Executors线程池

Executors线程池

m0_47743175的博客 2186

13、混合系统的离散与连续交互

本文详细探讨了混合系统中离散事件与连续动态的交互机制,涵盖了建模方法、分析技术、设计挑战以及多种控制策略。通过具体案例研究和操作语义的定义,展示了混合系统在制造业、交通系统、机器人技术和过程控制等领域的广泛应用。文章还介绍了实验仿真、稳定性研究及优化方法,旨在帮助读者全面理解混合系统的设计与控制要点,并为未来智能化和自适应混合系统的发展提供了展望。

5f4d3s2a1q的博客 127

Executors类创建四种常见线程池

文章目录线程池架构newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolExecutors和ThreaPoolExecutor创建线程池的区别两种提交任务的方法executesubmit 线程池架构 上图是线程池的架构图。Java里面线程池的顶级接口是Executor,Executor并...

ThinkWon的博客 1万+

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 549

ARM功耗管理软件之DVFS&AVS

思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

AI-安全-功耗 1230

Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 newS...

nothingchoice的博客 218

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java中executors_Java通过Executors提供四种线程池

http://cuisuqiang.iteye.com/blog/2019372Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledTh...

weixin_42548893的博客 789

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

java通过executors提供线程池,Java通过Executors提供四种线程池(示例代码)

Java通过Executors提供四种线程池,分别为:1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。4、...

weixin_39638623的博客 183

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java通过executors提供线程池,Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为:1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。2、newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3、newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。4、...

weixin_36143290的博客 186
上一篇: 周期性线程池Executors.newScheduledThreadPool
下一篇: 可控的异步任务-FutureTask
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值