美文网首页
自定义线程池执行流程

自定义线程池执行流程

作者: laod_wh | 来源:发表于2019-09-25 18:07 被阅读0次

    当任务提交给ThreadPoolExecutor 线程池中

    • 先检查核心线程数是否已经全部使用,如果没有交由核心线程去执行任务
    • 如果核心线程数已经全部占用,则将任务添加到队列里面
    • 如果队列已经占满,比较当前线程池的中线程的数量是不是与超过maximumPoolSize
    • 如果没有查过则创建线程去执行,也就是说线程池最多可以接受多少任务呢?就是maximumPoolSize+队列的大小。
    • 当线程池中的线程的数量大于corePoolSize数量有空闲线程则执行回收,回收时间是keepAliveTime,单位是unit,都是初始化的时候设置的。
    //三种阻塞队列:
        BlockingQueue<Runnable> workQueue = null;
        workQueue = new ArrayBlockingQueue<>(5);//基于数组的先进先出队列,有界
        workQueue = new LinkedBlockingQueue<>();//基于链表的先进先出队列,无界
        workQueue = new SynchronousQueue<>();//无缓冲的等待队列,无界
    //四种拒绝策略:
        RejectedExecutionHandler rejected = null;
        rejected = new ThreadPoolExecutor.AbortPolicy();//默认,队列满了丢任务抛出异常
        rejected = new ThreadPoolExecutor.DiscardPolicy();//队列满了丢任务不异常
        rejected = new ThreadPoolExecutor.DiscardOldestPolicy();//将最早进入队列的任务删,之后再尝试加入队列
        rejected = new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到线程池失败,那么主线程会自己去执行该任务
    //五种线程池:
        ExecutorService threadPool = null;
        threadPool = Executors.newCachedThreadPool();//有缓冲的线程池,线程数 JVM 控制
        threadPool = Executors.newFixedThreadPool(3);//固定大小的线程池
        threadPool = Executors.newScheduledThreadPool(2);
        threadPool = Executors.newSingleThreadExecutor();//单线程的线程池,只有一个线程在工作
        threadPool = new ThreadPoolExecutor();//默认线程池,可控制参数比较多 
    

    多线程编程基础知识:

    /**
    了解JDK Executors线程池吗?
    知道JDK提供了哪些默认的实现吗?
    看过阿里巴巴java开发手册吗?知道为啥不允许使用默认的实现吗?
    你们没有用默认的吧?那来介绍一下你们自定义线程池的几个常用参数呗?
    你这个几个参数的值是怎么得来的呀?算出来的?怎么算出来的?
    线程池里面的任务是IO密集型的还是计算密集型的呢?
    好,现在我们有一个自定义线程池了,来说一下你这个线程池的工作流程呗?
    那你这个线程池满了怎么办呀?拒绝?咋拒绝?有哪些拒绝策略呢?
    别紧张,随便说两个就行。
    */
    

    相关文章

      网友评论

          本文标题:自定义线程池执行流程

          本文链接:https://www.haomeiwen.com/subject/kmujuctx.html