万字总结最全Java线程池ThreadPoolExecutor面试题(一)

简介: 万字总结最全Java线程池ThreadPoolExecutor面试题(一)

网络异常,图片无法展示
|
1 为什么要用线程池

1.1 线程the more, the better?

1、线程在java中是一个对象,更是操作系统的资源,线程创建、销毁都需要时间。

如果创建时间+销毁时间>执行任务时间就很不合算。

2、Java对象占用堆内存,操作系统线程占用系统内存,根据JVM规范,一个线程默认最大栈

大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。

3、操作系统需要频繁切换线程上下文(大家都想被运行),影响性能。


线程使应用能够更加充分合理地协调利用CPU、内存、网络、I/O等系统资源.

线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间;

在线程销毁时需要回收这些系统资源.

频繁地创建和销毁线程会浪费大量的系统资源,增加并发编程风险.


在服务器负载过大的时候,如何让新的线程等待或者友好地拒绝服务?


这些都是线程自身无法解决的;

所以需要通过线程池协调多个线程,并实现类似主次线程隔离、定时执行、周期执行等任务.


2 线程池的作用

● 利用线程池管理并复用线程、控制最大并发数等

既然使用了线程池就需要确保线程池是在复用的,每次new一个线程池出来可能比不用线程池还糟糕。如果没有直接声明线程池而是使用其他人提供的类库来获得一个线程池,请务必查看源码,以确认线程池的实例化方式和配置是符合预期的


● 实现任务线程队列缓存策略和拒绝机制


● 实现某些与时间相关的功能

如定时执行、周期执行等


● 隔离线程环境

比如,交易服务和搜索服务在同一台服务器上,分别开启两个线程池,交易线程的资源消耗明显要大;

因此,通过配置独立的线程池,将较慢的交易服务与搜索服务隔离开,避免各服务线程相互影响.


在开发中,合理地使用线程池能够带来3个好处


降低资源消耗 通过重复利用已创建的线程,降低创建和销毁线程造成的系统资源消耗

提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行

提高线程的可管理性 线程是稀缺资源,如果过多地创建,不仅会消耗系统资源,还会降低系统的稳定性,导致使用线程池可以进行统一分配、调优和监控。

3 概念

1、线程池管理器

用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;

2、工作线程

线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

3、任务接口

每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

4、任务队列

用于存放没有处理的任务。提供缓冲机制。.

原理示意图

image.png

4 线程池API

4.1 接口定义和实现类

image.png.线程池相关类图

image.png


目录
相关文章
|
2月前
|
Java 调度 数据库
Java并发编程:深入理解线程池
在Java并发编程的海洋中,线程池是一艘强大的船,它不仅提高了性能,还简化了代码结构。本文将带你潜入线程池的深海,探索其核心组件、工作原理及如何高效利用线程池来优化你的并发应用。
|
2月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
70 1
|
27天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
28天前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
62 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
1月前
|
消息中间件 前端开发 NoSQL
面试官:如何实现线程池任务编排?
面试官:如何实现线程池任务编排?
27 1
面试官:如何实现线程池任务编排?
|
1月前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
1月前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
1月前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用
|
2月前
|
Java
【多线程面试题二十五】、说说你对AQS的理解
这篇文章阐述了对Java中的AbstractQueuedSynchronizer(AQS)的理解,AQS是一个用于构建锁和其他同步组件的框架,它通过维护同步状态和FIFO等待队列,以及线程的阻塞与唤醒机制,来实现同步器的高效管理,并且可以通过实现特定的方法来自定义同步组件的行为。
【多线程面试题二十五】、说说你对AQS的理解
|
12天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
13 0