线程池7个参数

线程池

什么是线程池?
线程池就是一个可以复用线程的技术。
不使用线程池的问题
如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。

JDK 5.0起提供了代表线程池的接口:ExecutorService
如何得到线程池对象
方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象

 

方式二:使用Executors(线程池的工具类)调用方法返回不同特点的线程池对象

ThreadPoolExecutor构造器的参数说明

public ThreadPoolExecutor(
         int corePoolSize,                          
        int maximumPoolSize,                          
        long keepAliveTime,                          
        TimeUnit unit,                          
        BlockingQueue<Runnable> workQueue,                          
        ThreadFactory threadFactory,                          
        RejectedExecutionHandler handler
) 

参数一:指定线程池的线程数量(核心线程): corePoolSize 不能小于0  这些线程是不会死的 一直都在的线程
参数二:指定线程池可支持的最大线程数: maximumPoolSize 最大数量 >= 核心线程数量。多出的线程是临时工 处理完是要销毁的
参数三:指定临时线程的最大存活时间: keepAliveTime 不能小于0
参数四:指定存活时间的单位(秒、分、时、天): unit 时间单位
参数五:指定任务队列: workQueue 不能为null  (可以 处理任务接口:runnable callable)
参数六:指定用哪个线程工厂创建线程: threadFactory 不能为null
参数七:指定线程忙,任务满的时候,新任务来了怎么办: handler 不能为null

线程池常见面试题
临时线程什么时候创建啊?
新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。
什么时候会开始拒绝任务?
核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝。

ThreadPoolExecutor创建线程池对象示例

        ExecutorService pool = new ThreadPoolExecutor(
                3, 
                5 ,
                6, 
                TimeUnit.SECONDS, 
                new ArrayBlockingQueue<>(5) , 
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy() 
        );

ExecutorService的常用方法

新任务拒绝策略

 

 

  

 

posted @ 2022-11-30 10:46  __破  阅读(91)  评论(0)    收藏  举报