java线程池

1、说到线程池,想通肯定会想到数据库连接池,其技术思想是相通的,那有什么优点呢?

降低资源消耗:避免重复创建、销毁线程。

高响应速度:直接从线程池获取,省去创建时间。

提高线程的可管理性:用线程池进行统一的分配,调优和监控。

2、说一说有几个参数?分别代表什么含义?

一共7个参数,如下:

publicThreadPoolExecutor(int corePoolSize,      ----核心线程数

                              int maximumPoolSize,            ----最大线程数

                              long keepAliveTime,               -----非核心线程,空闲多久被回收(缩容)

                              TimeUnit unit,                         ------时间单位,与上一个参数配合

                              BlockingQueue workQueue,    -----阻塞队列大小

                              ThreadFactory threadFactory, -------默认线程工厂

                              RejectedExecutionHandler handler)-----饱和拒绝策略

3、谈一谈线程池工作原理?

    初始化线程池,此时线程数量是0,当来任务时会先判断,当前线程数量是否小于核心线程数,如果小于则直接创建线程并执行任务;如果此时线程数达到核心线程数并且阻塞队列不满,则此任务进入阻塞队列;如果处理任务慢,来的任务快,过段时间阻塞队列也会满;阻塞队列满了以后就会创建新的线程来分担任务,但是创建的总线程数不会超过最大线程数。当线程数等于最大线程数并且阻塞队列已满,此时就会启动饱和拒绝策略。

4、谈一谈饱和拒绝策略有哪些?

    AbortPolicy(默认):直接抛出RejectedExecutionException,异常阻止系统正常运行。

    CallerRunsPolicy:该策略既不会抛弃任务,也不会抛出异常,而是将某些任务退回给调用者;一句话从哪来,就给我回哪去。

    DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。

    DiscardPolicy:该策略默默丢弃无法处理的任务,不予任何处理也不抛出任何异常。如果允许任务丢失,这是最好的解决方法。

过程图如下:

java线程池_第1张图片

你可能感兴趣的:(java线程池)