线程池原理_四种类型_应用场景


# 线程池 #

-- JAVA线程池原理详解(1)

-- JAVA线程池原理详解(2)

-- Java线程池总结

**线程池概述:**

*    
     在一个应用程序中,我们需要多次使用线程,这就需要多次创建并销毁线程。而创建并销毁线程的过程会消耗内存。内存资源在java中很重要,所以就有了线程池用来管理线程,同时也减少了内存的消耗。Java中已经提供了创建线程池的一个类:Executor。平常我们创建   线程池时,一般使用它的子类:ThreadPoolExecutor。

 *  
      public ThreadPoolExecutor(

      int corePoolSize, // 线程池中的核心线程数量。这几个核心线程,在没有用的时候,也不会被回收   
      int maximumPoolSize,//线程池中可以容纳的最大线程的数量       
      long keepAliveTime, //线程池中除了核心线程之外的其他线程最长可以保留的时间。因 为在线程池中,核心线程在无任务的情况下也不能被清除,非核心线程是有存活时间的,就是非核心线程可以保留的最长的空闲时间      
      TimeUnit unit,// 计算除了核心线程之外的其他线程最长可以保留的时间的一个单位 
      BlockingQueue<Runnable> workQueue, //等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)      
      ThreadFactory threadFactory,  //创建线程的线程工厂      
     RejectedExecutionHandler handler一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务

     ......
     )

**线程池实现原理:**


    提交一个任务到线程池中,线程池的处理流程:

     1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。   
     2、如果核心线程都在执行任务,线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。    
     3、如果工作队列满了,就会判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给拒绝策略来处理这个任务。

 

 

 


**handler的拒绝策略有四种:**

 *  
     AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满

     DisCardPolicy:不执行新任务,也不抛出异常

     DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行

     CallerRunsPolicy:直接调用execute来执行当前任务


**四种常见的线程池种类**

①newSingleThreadExecutor:单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务

②newFixedThreadExecutor(n):固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用):可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor:大小无限制的线程池,支持定时和周期性的执行线程

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM