面试~线程池-三大方法、七个参数、四种拒绝策略、实际应用

简介: 面试~线程池-三大方法、七个参数、四种拒绝策略、实际应用

池化技术

程序的运行,本质:占用系统的资源! 优化资源的使用!=>池化技术

线程池、连接池、内存池、对象池///..... 创建、销毁。十分浪费资源


池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。


线程池的好处:

1、降低资源的消耗 2、提高响应的速度 3、方便管理。

线程复用、可以控制最大并发数、管理线程


★ 总结Java线程池的基本工作原理/线程池的执行流程:

  • 以上是考虑到满了的情况,当然这个过程是动态的,核心线程中执行完任务,就可以到任务队列拿任务去执行,任务队列空了,新提交的任务也可以放到任务队列中去。


三大方法

  • 创建单个线程、创建固定线程数量的、具有缓存作用的
ExecutorService threadPool = Executors.newSingleThreadExecutor();// 单个线程
ExecutorService threadPool = Executors.newFixedThreadPool(5); // 创建一个固定的线程池的大小
ExecutorService threadPool = Executors.newCachedThreadPool(); // 可伸缩的,遇强则强,遇弱则弱


七个参数

public ThreadPoolExecutor(int corePoolSize, //核心线程池大小
            int maximumPoolSize, //最大核心线程池大小
            long keepAliveTime, //超时了没有人调用就会释放
            TimeUnit unit, //超时单位
            BlockingQueue<Runnable> workQueue, //阻塞队列
            ThreadFactory threadFactory, //线程工厂:创建线程的,一般不用动
            RejectedExecutionHandler handle //拒绝策略
)


四种拒绝策略

new ThreadPoolExecutor.AbortPolicy() //默认策略,抛出异常
 new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里!将此任务交给调用者直接执行
 new ThreadPoolExecutor.DiscardPolicy() //不做任何操作
 new ThreadPoolExecutor.DiscardOldestPolicy() //丢弃队列中最老的任务,然后再执行该任务


池的最大的大小如何去设置!

了解:IO密集型,CPU密集型:(调优)

1、CPU 密集型,几核,就是几,可以保持CPu的效率最高!

2、IO 密集型 > 判断你程序中十分耗IO的线程, // 程序 15个大型任务 io十分占用资源!那么就设置为它的两倍,设置为30

// 获取CPU的核数 
System.out.println(Runtime.getRuntime().availableProcessors());


线程池的应用

1、发短信业务

在登录界面,使用手机号+验证码登录

特点:主业务和短信业务可以割裂开来。

当我们点击验证码的时候,连接短信业务平台发送短信,但是发送短信的业务会受到平台的影响,会有一定的延时。

我们使用线程池,就可以不用等到短信平台返回验证码之后再给用户返回。

我们先提示用户验证码获取成功,然后把短信业务放到另外一个线程中执行,使用线程池管理短信线程。

具体过程是:生成验证码,然后 调用线程池中的自定义的“短信线程”,调用短信平台,发送验证码;然后把验证码放入redis


2、多线程下载器

将需要下载的资源分块,然后开启多个线程,每个线程负责一块资源的下载。


3、还有我的博客项目也是运用了线程池

自定义一个线程来处理更新阅读浏览量,然后放到线程池进行管理。

目录
相关文章
|
1天前
|
缓存 Java
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
这篇文章详细介绍了Java中线程的四种初始化方式,包括继承Thread类、实现Runnable接口、实现Callable接口与FutureTask结合使用,以及使用线程池。同时,还深入探讨了线程池的七大参数及其作用,解释了线程池的运行流程,并列举了四种常见的线程池类型。最后,阐述了在开发中使用线程池的原因,如降低资源消耗、提高响应速度和增强线程的可管理性。
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
|
1天前
|
Java 数据库
异步&线程池 CompletableFuture 异步编排 实战应用 【终结篇】
这篇文章通过一个电商商品详情页的实战案例,展示了如何使用`CompletableFuture`进行异步编排,以解决在不同数据库表中查询商品信息的问题,并提供了详细的代码实现和遇到问题(如图片未显示)的解决方案。
异步&线程池 CompletableFuture 异步编排 实战应用 【终结篇】
|
1天前
|
Java
java开启线程的四种方法
这篇文章介绍了Java中开启线程的四种方法,包括继承Thread类、实现Runnable接口、实现Callable接口和创建线程池,每种方法都提供了代码实现和测试结果。
java开启线程的四种方法
|
9天前
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
37 7
|
8天前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
28 4
|
12天前
|
运维 监控 容灾
[go 面试] 实现服务高可用的策略和实践
[go 面试] 实现服务高可用的策略和实践
|
4天前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
4天前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
31 0
|
6天前
三个线程交替打印ABC:技术深度解析与实战应用
【8月更文挑战第14天】在并发编程中,实现多个线程之间的精确协同工作是一项既具挑战性又极具实用价值的任务。今天,我们将深入探讨一个经典问题:如何使用三个线程交替打印字符A、B、C,且每个字符连续打印三次,之后循环进行。这个问题不仅考验了我们对线程同步机制的理解,还锻炼了我们在复杂并发场景下的设计能力。
12 0
|
8天前
|
Java
多线程 ThreadPoolTaskExecutor 应用
多线程 ThreadPoolTaskExecutor 应用
16 0