1. Java线程池的作用

1. Java线程池的作用
- 降低资源消耗
- 通过重复利用已创建的线程,减少线程创建和销毁带来的开销。线程创建和销毁需要系统分配和回收资源,如内存等。例如,频繁创建和销毁线程的场景中,如果使用线程池,就可以避免每次都进行这些资源的分配和回收操作,从而提高系统的性能和效率。
- 提高响应速度
- 当有任务需要执行时,线程池中的线程可以立即执行任务,而不需要等待线程创建的过程。比如在一个Web服务器中,当有多个客户端请求同时到达时,如果使用线程池,线程池中的线程可以马上处理这些请求,减少客户端的等待时间,提高服务器对请求的响应速度。
- 便于线程管理
- 线程池可以统一管理线程的生命周期、数量等。可以设置线程池中的最大线程数,避免线程过多导致系统资源耗尽。例如,可以根据系统的资源状况和任务的负载情况,合理地配置线程池中的线程数量,同时还可以对线程进行监控和管理,如查看线程的执行状态等。
2. Java线程池的实现方式
- 使用 ThreadPoolExecutor 类
- 构造函数参数
-  ThreadPoolExecutor 的构造函数有多个参数,主要包括核心线程数( corePoolSize )、最大线程数( maxPoolSize )、线程存活时间( keepAliveTime )、时间单位( unit )、任务队列( workQueue )、线程工厂( threadFactory )和拒绝策略( handler )。
- 核心线程数是线程池中始终保持的线程数量,即使这些线程处于空闲状态也不会被销毁。最大线程数是线程池允许存在的线程的最大数量。当任务队列已满且线程数量小于最大线程数时,会创建新的线程来执行任务。线程存活时间是指当线程数量超过核心线程数时,多余的空闲线程在等待新任务的时间达到该存活时间后会被销毁。时间单位用于指定线程存活时间的单位。任务队列用于存放等待执行的任务。线程工厂用于创建线程。拒绝策略用于当任务队列已满且线程数量达到最大线程数时,决定如何处理新到来的任务。
- 示例代码
 
java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个线程池,核心线程数为3,最大线程数为5,线程存活时间为10秒,任务队列使用LinkedBlockingQueue
        ExecutorService executorService = new ThreadPoolExecutor(3, 5, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executorService.execute(() -> {
                System.out.println("Task " + taskId + " is being executed by thread " + Thread.currentThread().getName());
            });
        }
        // 关闭线程池
        executorService.shutdown();
    }
}
 
 
- 使用 Executors 工厂类
-  Executors 工厂类提供了一些静态方法来创建不同类型的线程池。
-  newFixedThreadPool 
- 创建一个固定大小的线程池,线程数量固定为指定的值。例如:
 
java
ExecutorService executorService = Executors.newFixedThreadPool(5);
 
 
- 其内部实际上也是使用 ThreadPoolExecutor 类来实现的,只是一些参数已经被默认设置好了。它的核心线程数和最大线程数相等,都等于指定的线程数量,任务队列使用 LinkedBlockingQueue ,没有设置线程存活时间(实际上是 0L ,但由于核心线程数和最大线程数相等,所以不会有线程被销毁),线程工厂使用默认的线程工厂,拒绝策略使用 AbortPolicy (当任务队列已满且线程数量达到最大线程数时,会抛出 RejectedTaskException )。
-  newCachedThreadPool 
- 创建一个可根据需要创建新线程的线程池。例如:
 
java
ExecutorService executorService = Executors.newCachedThreadPool();
 
 
- 它的核心线程数为 0 ,最大线程数为 Integer.MAX_VALUE ,任务队列使用 SynchronousQueue (一个不存储任务的队列,要求有一个线程来立即执行新到来的任务),线程存活时间为 60 秒,线程工厂使用默认的线程工厂,拒绝策略使用 AbortPolicy 。当有新任务到来时,如果当前没有空闲线程,就会创建一个新线程来执行任务,当线程空闲一段时间( 60 秒)后会被销毁。
-  newSingleThreadPool 
- 创建一个只有一个线程的线程池。例如:
 
java
ExecutorService executorService = Executors.newSingleThreadPool();
 
 
- 它的核心线程数和最大线程数都为 1 ,任务队列使用 LinkedBlockingQueue ,没有设置线程存活时间(实际上是 0L ,但由于只有一个线程,所以不会有线程被销毁),线程工厂使用默认的线程工厂,拒绝策略使用 AbortPolicy 。所有任务都在这一个线程中依次执行。
全部评论

相关推荐

🎤&nbsp;面经:1.&nbsp;自我介绍2.&nbsp;为什么从运营转产品?3.&nbsp;你认为优秀的产品经理一般会具有哪些特质?4.&nbsp;你觉得C端和产品和B端产品有什么差异?5.&nbsp;你觉得在产品的工作这个岗位上,你个人的优劣势分别是什么?6.&nbsp;讲一个你在实习过程中比较能体现你个人能力的一个项目。7.&nbsp;在这个项目里面当时是怎么去设定目标?8.&nbsp;这个项目过程中有没有存在一些困难和挑战?然后是怎么应对的?9.&nbsp;如果说你这个项目再做一次的话,你觉得哪些地方可以你认为可以做得更好?10.&nbsp;在项目推进过程中,研发总会有各种各样的一些挑战,包括有资源的瓶颈等等,你一般是怎么去解决的呢?11.&nbsp;我们在同一个时间段内可能会收集到来自于不同业务方很多的一些待介入的需求,这样的话你与会怎么去给这些需求去制定优先级呢?12.&nbsp;你在项目的过程中可能也会遇到很多的一些突发的事件,比如说项目老是一直延期,当面临这样的问题的时候,怎么去降低就是延期的一些风险?或者真的要面临延期以后,一般是怎么去解决这个问题的?13.&nbsp;你个人就是在产品的职业规划上,在未来的几年大概是怎么一个规划的?14.&nbsp;为什么想要做xx赛道的产品?15.&nbsp;你觉得货架电商和直播电商它的一些区别是什么?以及就是他们各自优劣势是什么?可以简单聊聊你的理解。16.&nbsp;反问⏰&nbsp;Timeline:8.8投递&nbsp;-&nbsp;8.16一面&nbsp;-&nbsp;9.2二面&nbsp;-&nbsp;挂✏️体验:一面面试官考察综合能力更多,实习项目挖掘经历比较少。大多是考察一些产品日常能力点,基本可以准备得到。二面面试官考察开放式题目更多,重点考察了很多电商APP之间的不同点和相同点,有点压力面的意思,个人感觉二面面试官语气很冲,不是很尊重候选人,聊的不是特别愉快,所以最后挂了也算解脱了。#非技术面试记录##非技术求职现状##快手##25届秋招##秋招#
点赞 评论 收藏
分享
1 2 评论
分享
牛客网
牛客企业服务