zoukankan      html  css  js  c++  java
  • 线程池

    线程池的实现原理,这个知识点真的很重要,几乎每次面试都会被问到,一般的提问方式有如下几种:

    1、“讲讲线程池的实现原理” 2、“线程池中的coreNum和maxNum有什么不同” 3、“在不同的业务场景中,线程池参数如何设置”

    场景对话

     面试官:平时线程池用的多么?

    我:嗯,我的*项目中就用到了。

    面试官:那好,你讲讲线程池的实现原理。

    我:(还好我之前看过源码,但是时间久远有点模糊了),能给我笔和纸么,我画图分析给你看看,&&¥&假设初始化一个线程池,核心线程数是5,最大线程数是10@@@。

    面试官:嗯,好的,你继续...

    我:在纸上画了正方形,这个代表一个线程池,初始化的时候,里面是没有线程的。

    面试官:嗯,好的,你继续...

    我:又画了一个细长的长方形,这个代表阻塞队列,一开始里面也是没有任务的。

    面试官:嗯,好的,你继续...

    我:当来了一个任务时,在正方形中画了一个小圆圈,代表初始化了一个线程,如果再来一个任务,就再画一个圆圈,表示再初始化了一个线程,连续画了5个圆圈之后,如果第6个任务过来了...

    面试官:嗯,好的,你继续...

    我:这时会把第6个任务放到阻塞队列中.…

    面试官:嗯,然后呢?

    我:现在线程池中不是有5个线程了么,如果其中一个线程空闲了,就会从阻塞队列中获取第6个任务,进行执行…

    面试官:嗯,对的,那如果任务产生的速度比消费的速度快呢?

    我:如果线程池的5个线程都在running状态,那么任务就先保存在阻塞队列中…

    面试官:如果队列满了,怎么办?

    我:如果队列满了,我们不是设置了最大线程数是10么,而线程池中只有5个线程,这时会新建一个线程去执行不能保存到阻塞队列的任务,然后我又在正方形中画了5个圆圈。

    面试官:那如果线程池中的线程数达到10个了,阻塞队列也满了,怎么办?

    我:这种情况通过自定义rejectExecution函数去处理这里任务了,舒了一口去,以为问完了...

    [JDK内置四种拒绝策略]:

    1、AbortPolicy策略
    该策略直接抛出异常,阻止系统工作
    2、CallerRunsPolicy策略
    只要线程池未关闭,该策略直接在execute 方法的调用线程中运行当前被丢弃的任务。但是,调用线程性能可能急剧下降。
    3、DiscardOledestPolicy策略
    丢弃最老的一个请求任务,也就是丢弃一个阻塞队列头的请求,并尝试再次提交当前任务。
    4、DiscardPolicy策略
    默默的丢弃无法处理的任务,不予任何处理。
    [自定义reject方法]
    重写接口RejectedExecutionHandler的rejectedExecution方法 
    如下:

    ThreadPoolExecutor executor= newThreadPoolExecutor(5, 5,

                  0L, TimeUnit.MILLISECONDS,

                  newLinkedBlockingQueue(10),

                  Executors.defaultThreadFactory(),

                  newRejectedExecutionHandler() {  

                      @Override

                      public voidrejectedExecution(Runnable r, ThreadPoolExecutor executor) {

                         System.out.println(r.toString()+" 被抛弃了");

                      }

                  });

           MyTask task= newMyTask();

           for(int i=0;i<20;i++){

               executor.submit(task);

           }

           executor.shutdown();

    面试官:好的,那如果运行一段时间之后,阻塞队列中的任务也执行完了,线程池中的线程会怎么样?

    我:...这个好像超过核心线程数的线程会在空闲一段时间内自动回收...因为有点不记得这个逻辑了,回答的有点虚...

    面试官:好的,那这种情况在什么场景下会发生?

    我:(有时候真是笨啊,很多东西都知道,但是在面试的时候一紧张,全忘记)这个...那个...我好像没有遇到过这样的情况。

    面试官:嗯,好的,你回去之后再好好想想

    我:........(被秒杀)

  • 相关阅读:
    C语言I博客作业03
    C语言I博客作业02
    JSON Template
    Mac系统登录不进系统解决办法
    Mac怎么安装并配置Homebrew?
    tensorflow 安装命令
    删除表重复数据
    redhat安装docker
    Rabbit MQ 入门指南
    Maven 集成Tomcat7插件
  • 原文地址:https://www.cnblogs.com/WegYcx/p/7493999.html
Copyright © 2011-2022 走看看