Java多线程之线程池

简介: 1. 线程池的作用2. 使用线程池的好处3. 线程池的七个参数4. 线程池执行任务的流程5. Java 标准库中的线程池1)newFixedThreadPool2)newCachedThreadPool3)newScheduleThreadPool4)newSingleThreadExecutor6. 对比两种提交任务的方法

1. 线程池的作用

创建和销毁线程都需要消耗系统资源,线程池就是为了降低系统资源消耗而存在的


线程执行完任务之后不会被销毁,而是放入线程池中,下次使用就直接在线程池中取,减少了创建和销毁线程消耗的资源


2. 使用线程池的好处

降低系统资源消耗,通过重复利用线程池中的线程来降低创建和销毁线程的消耗

提高响应速度,当任务到达时,不再需要等待创建完线程再执行

提高线程的可管理性,使用线程池可以统一对线程进行分配、调度和监控


3. 线程池的七个参数

corePoolSize:核心线程最大数量,核心线程一经创建就不会被销毁,除非线程池销毁

maximumPoolSize:线程池中最大线程数量,总线程数 = 核心线程数 + 非核心线程数

keepAliveTime:非核心线程的最大空闲时间,非核心线程在 keepAliveTime 时间后还没有执行任务,就会被销毁

unit:keepAliveTime 的时间单位,秒、分钟或者其他单位

workQueue:阻塞队列,有 ArrayBlockingQueue、LinkedBlockingQueue 等,用来存放线程任务

ThreadFactory:线程工厂,用来创建线程

RejectedExecutionHandler:拒绝策略,如果任务数量超过线程池最大负荷(),该怎么处理

AbortPolicy():丢弃当前线程任务,抛出异常

DiscardPolicy():丢弃当前线程任务,不抛异常

DiscardOldestPolicy():丢弃阻塞队列队首任务,不抛异常

CallerRunsPolicy():当前任务由调用者线程执行


4. 线程池执行任务的流程

51.jpg

5. Java 标准库中的线程池

Java 标准库中提供了 Executers 类来创建线程池,Executers 类创建线程池的方法有以下几种


1)newFixedThreadPool

创建一个固定线程数量的线程池,每提交一个任务就创建一个工作线程,工作线程数量达到指定的最大值,就将任务放入阻塞队列中


2)newCachedThreadPool

创建一个可缓存线程池,此类线程池中的所有线程只有 60 秒的最大空闲时间,线程空闲超过 60 秒就会被销毁,线程数量几乎没有限制


3)newScheduleThreadPool

创建一个定长的线程池,此线程池支持周期性的执行和延时执行某一个任务


使用 scheduleAtFixedRate() 或 scheduleWithFixedDelay() 即可实现周期性的任务执行

// 创建线程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
// 以下两种方法结果相同,延迟五秒开始执行,每隔两秒执行一次
scheduledExecutorService.scheduleAtFixedRate(thread2, 5, 2, TimeUnit.SECONDS);
scheduledExecutorService.scheduleWithFixedDelay(thread2, 5, 2, TimeUnit.SECONDS);

4)newSingleThreadExecutor

创建一个单线程化的线程池,线程池中只有唯一一个线程来执行任务,保证所有线程按照指定顺序执行,如果这个线程异常结束了,就会创建另一个线程来替代他。


6. 对比两种提交任务的方法

向线程池提交任务一般使用 execute() 和 submit()


execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被执行成功

submit() 方法用于提交需要返回值的任务,线程池会返回一个 Future 类型的对象,通过这个对象可以判断任务是否执行成功,可以通过该对象的 get() 方法获取返回值。


目录
相关文章
|
12天前
|
设计模式 缓存 安全
【JUC】(6)带你了解共享模型之 享元和不可变 模型并初步带你了解并发工具 线程池Pool,文章内还有饥饿问题、设计模式之工作线程的解决于实现
JUC专栏第六篇,本文带你了解两个共享模型:享元和不可变 模型,并初步带你了解并发工具 线程池Pool,文章中还有解决饥饿问题、设计模式之工作线程的实现
67 2
|
12天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
58 1
|
12天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
51 1
|
1月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
79 0
|
1月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
124 16
|
2月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
2月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
3月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
3月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
321 83

热门文章

最新文章