线程池的处理策略(ThreadPoolExecutor)

Posted 龙旋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池的处理策略(ThreadPoolExecutor)相关的知识,希望对你有一定的参考价值。

1.什么是线程池?
由于线程的运行的速度太快,可能线程的销毁时间比运行的时间还要长,所以出现线程池可以在池里面先定义一定数量的线程,等要用的时候再从线程池里面进行获取,用完之后再统一进行销毁。

2.线程池的处理策略


图解析:

1.先在线程池里面定义5个核心线程,当有任务来的时候,会由核心线程进行处理任务。

2.再有任务来的时候,此时核心线程正在处理任务,所以会将来的任务放在消息队列(阻塞队列)中(最多装10个)

3.消息队列放满的时候,还有任务到来,此时会请外来的线程进行处理,外来的线程是有限的(由maxmumPoolSize和corePoolSize决定)

4.当核心线程,消息队列,还有外来线程都放满了,此时还有任务到来的时候,线程池会有5种处理策略:抛异常,不做任何处理,移除队列中的某个,main线程执行这个任务,自定义.


3.构建线程池的源码:


 
   
   
 
  1. public ThreadPoolExecutor(int corePoolSize, //核心线程数

  2.                          int maximumPoolSize,//最大线程数(核心线程+外来线程)

  3.                          long keepAliveTime,//外来线程的存活时间

  4.                          TimeUnit unit,//存活时间的单位

  5.                          BlockingQueue<Runnable> workQueue,//消息队列

  6.                          ThreadFactory threadFactory,//线程工厂

  7.                          RejectedExecutionHandler handler)//当核心线程,消息队列,还有外来线程都放满后的处理机制


4.演示代码:

 
 
   
   
 
  1. import java.util.concurrent.BlockingQueue;

  2. import java.util.concurrent.ExecutorService;

  3. import java.util.concurrent.Executors;

  4. import java.util.concurrent.LinkedBlockingQueue;

  5. import java.util.concurrent.RejectedExecutionHandler;

  6. import java.util.concurrent.ThreadFactory;

  7. import java.util.concurrent.ThreadPoolExecutor;

  8. import java.util.concurrent.TimeUnit;


  9. public class Main {


  10.    public static void main(String[] args) {


  11.        BlockingQueue blockingQueue = new LinkedBlockingQueue(10);


  12.        ThreadFactory factory = Executors.defaultThreadFactory();


  13.        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();// 抛异常


  14.        // 构建线程池


  15.        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 9, 30, TimeUnit.SECONDS, blockingQueue, factory,

  16.                handler);


  17.        for (int i = 0; i < 30; i++) {


  18.            int temp=i;


  19.            executor.execute(new Runnable() {


  20.                @Override


  21.                public void run() {


  22.                    System.out.println(temp+":"+Thread.currentThread().getName());


  23.                    try {


  24.                        Thread.sleep(5000);


  25.                    } catch (InterruptedException e) {


  26.                        e.printStackTrace();

  27.                    }


  28.                }

  29.            });

  30.        }

  31. //        int poolSize = executor.getPoolSize();


  32. //        System.out.println("poolSize:"+poolSize);


  33.        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);


  34. //        newFixedThreadPool.execute(command);


  35.        Executors.newSingleThreadExecutor();


  36.    }

  37. }



以上是关于线程池的处理策略(ThreadPoolExecutor)的主要内容,如果未能解决你的问题,请参考以下文章

jdk线程池的四种拒绝策略

每期一个小窍门: java线程池的几种任务拒绝策略

每期一个小窍门: java线程池的几种任务拒绝策略

每期一个小窍门: java线程池的几种任务拒绝策略

Android性能优化之线程池策略和对线程池的了解

第224天学习打卡(知识点回顾 线程池的拒绝策略)