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

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

池化技术

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

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


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


线程池的好处:

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

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

目录
相关文章
|
21天前
|
安全 Java 程序员
面试必看:如何设计一个可以优雅停止的线程?
嘿,大家好!我是小米。今天分享一篇关于“如何停止一个正在运行的线程”的面试干货。通过一次Java面试经历,我明白了停止线程不仅仅是技术问题,更是设计问题。Thread.stop()已被弃用,推荐使用Thread.interrupt()、标志位或ExecutorService来优雅地停止线程,避免资源泄漏和数据不一致。希望这篇文章能帮助你更好地理解Java多线程机制,面试顺利! 我是小米,喜欢分享技术的29岁程序员。欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
86 53
|
6天前
|
数据采集 Java Linux
面试大神教你:如何巧妙回答线程优先级这个经典考题?
大家好,我是小米。本文通过故事讲解Java面试中常见的线程优先级问题。小明和小华的故事帮助理解线程优先级:高优先级线程更可能被调度执行,但并非越高越好。实际开发需权衡业务需求,合理设置优先级。掌握线程优先级不仅能写出高效代码,还能在面试中脱颖而出。最后,小张因深入分析成功拿下Offer。希望这篇文章能助你在面试中游刃有余!
29 4
面试大神教你:如何巧妙回答线程优先级这个经典考题?
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14
|
5天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
9天前
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
37 6
|
25天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
65 16
|
6月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
3月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
3月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
3月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
96 4