java基础之线程池
一、线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销
作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务
使用线程池中线程对象的步骤:
1. 创建线程池对象。
2..创建Runnable接口子类对象(线程所要执行的任务【target】)
3. 提交Runnable接口子类对象。
public class ExecutorTest {
/**
* 一个线程池,2个线程,3个任务 Executors:线程池工具类(一个任务对应一个线程)
ThreadPoolExecutor底层实现是用非阻塞机制
* @param args
*/
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new RunableDemo());
executorService.submit(new RunableDemo());
executorService.submit(new RunableDemo());
}
}
二、创建线程池的5种方式:可缓存、定时、定长、单列、抢占
1:创建单核心的线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
作用:线程池中使用的从始至终都是单个线程,所以这里的线程名字都是相同的,而且下载任务都是一个一个的来,直到有空闲线程时,
才会继续执行任务,否则都是等待状态。
2:创建固定核心数的线程池,这里核心数 = 2
ExecutorService executorService = Executors.newFixedThreadPool(2);
作用:两个线程执行任务可以同时进行,并且所用的线程数量始终都只有两个,因为它的最大线程数等于核心线程数,线程存活时间都是无限的,
不会再去创建新的线程了
3:创建一个自动增长的线程池
ExecutorService executorService = Executors.newCachedThreadPool();
作用:没有核心线程数,但是我们的最大线程数没有限制,所以一点全部开始下载,就会创建出 5 条新的线程同时执行任务,从上图的例子看出,
每天线程都不一样
4:创建一个具有抢占式操作的线程池
ExecutorService executorService = Executors.newWorkStealingPool();
作用:可以看出WorkStealingPool这个方法会以当前机器的CPU处理器个数为线程个数,这个线程池会并行处理任务,且不保证顺序,
同时并发数能作为参数设置,而任务如果想要都执行就要设置和任务数量对应的并发数。
三、源码代码分析:

当任务数<核心线程数时,任务由核心线程执行
当任务数>核心线程数&&任务数<阻塞队列长度时,任务由核心线程执行
当任务数>阻塞队列长度时,需要创建新线程(n),但核心线程数 + n不能大于最大线程数
java基础之线程池的更多相关文章
- Java基础教程——线程池
启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这 ...
- java基础-多线程线程池
线程池 * 程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互.而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池.线程池里的每一个线程代 ...
- java基础系列——线程池
一.线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池. public ThreadPoolExecutor(int corePoolSize, int maximumPo ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- (转载)new Thread的弊端及Java四种线程池的使用
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...
- Java并发之——线程池
一. 线程池介绍 1.1 简介 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡 ...
- Java多线程与线程池技术
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...
- java笔记--使用线程池优化多线程编程
使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
随机推荐
- Docker实践:创建并运行一个自定义的Docker Image
1 目标: 创建一个自定义的Image,在该Image中,包含一个自己的Python程序,通过docker运行该Image 容器,并执行我们自己的Python程序,通过添加数据卷,在本机能够查看Pyt ...
- Linux 文件压缩和解压缩命令
Linux 文件压缩和解压缩命令 在Linux操作系统中,文件压缩和解压缩是日常管理和维护任务中的重要一环.通过压缩文件,可以显著减少存储空间的使用,并加快网络传输速度.Linux提供了多种压缩和解压 ...
- 国产AI生态新突破!“息壤”+DeepSeek王炸组合来了!
2025,国产AI火力全开! 天翼云"息壤"深度适配DeepSeek-R1/V3 实现"国产模型+国产算力+国产云服务" 全产业链闭环 打造国产AI新高度 助力 ...
- Flink内存解释
一.JobManager内存 JobManager 是 Flink 集群的控制单元. 它由三种不同的组件组成:ResourceManager.Dispatcher 和每个正在运行作业的 JobMast ...
- Linux驱动---LED
目录 一.pinctrl子系统 二.GPIO子系统 三.GPIO操作步骤 3.1.获取GPIO描述符 3.2.设置方向 3.3.读写值 四.编写LED驱动 4.1.硬件原理图 4.2.修改设备树 4. ...
- 【博客搭建】Hexo使用笔记
[博客搭建]Hexo 使用笔记 Hexo 是一款前端博客框架,可以自动根据基于 Markdown 的文章生成博客网站代码. 基本概念 项目结构 目录 描述 _config.yml 网站的配置信息 th ...
- Linux - 内核版本升级
测试时间:2024年5月15日,本文测试CentOS7.9的内核版本升级 测试结论:不要选择手动编译的方式!!! 一.使用第三方仓库(ELRepo) (1)升级前内核查看(3.10.0-1160.el ...
- 理解Rust引用及其生命周期标识(上)
写在前面 作为Rust开发者,你是否还没有完全理解引用及其生命周期?是否处于教程一看就会,但在实际开发过程中不知所措?本文将由浅入深,手把手教你彻底理解Rust引用与生命周期. 关于本文的理解门槛 本 ...
- linux服务器CPU占用100%,宝塔负载100%情况问题排查处理记录(CentOS 8.1系统)
问题描述:linux服务器cpu占比达到100%,站点无法正常访问,宝塔面板进入后卡顿,负载显示也是持续100%(下方测试系统为CentOS 8.1) 排查可能:1.使用netstat命令查看目前的链 ...
- C/C++ GOTO妙用
目录 GOTO 语句 跳出多层循环 循环首次部分跳过 GOTO 语句 C/C++ 的 goto 语句用来在一个函数内进行任意跳转,用起来也是很方便.示例如下: int a() { int x = 0, ...