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

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

池化技术

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

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


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


线程池的好处:

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、还有我的博客项目也是运用了线程池

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

目录
相关文章
|
23天前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
2天前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
25 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
3天前
|
消息中间件 存储 前端开发
面试官:说说停止线程池的执行流程?
面试官:说说停止线程池的执行流程?
18 2
面试官:说说停止线程池的执行流程?
|
6天前
|
消息中间件 前端开发 NoSQL
面试官:如何实现线程池任务编排?
面试官:如何实现线程池任务编排?
15 1
面试官:如何实现线程池任务编排?
|
4天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
1天前
|
Java 调度 开发者
Java中的多线程基础及其应用
【9月更文挑战第13天】本文将深入探讨Java中的多线程概念,从基本理论到实际应用,带你一步步了解如何有效使用多线程来提升程序的性能。我们将通过实际代码示例,展示如何在Java中创建和管理线程,以及如何利用线程池优化资源管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你更好地理解和应用多线程编程。
|
11天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
16天前
|
监控 负载均衡 算法
线程数突增!领导说再这么写就GC掉我:深入理解与优化策略
【8月更文挑战第29天】在软件开发的世界里,性能优化总是开发者们绕不开的话题。特别是当面对“线程数突增”这样的紧急情况时,更是考验着我们的技术功底和问题解决能力。今天,我们就来深入探讨这一话题,分享一些工作学习中积累的技术干货,帮助大家避免被“GC”(垃圾回收,也常用来幽默地表示“被炒鱿鱼”)的尴尬。
34 2
|
15天前
|
Java 程序员 调度
Java中的多线程基础与实战应用
【8月更文挑战第30天】在Java的世界里,多线程是提升程序性能的利器,但也是新手开发者常碰壁的难点。本文旨在通过浅显易懂的语言和生动的比喻,带领读者走进Java多线程的大门。我们将从线程的基本概念出发,逐步深入到线程的创建、启动、管理以及同步机制,最后通过一个简易版的图书管理系统实例,展示如何在实际开发中灵活运用多线程技术。
|
23天前
|
Java 调度