线程池

1. 什么是线程池?

    顾名思义,存放线程的一个池子。

2.怎么设计一个线程池

(1) 新建一个数组,创建一堆线程存放进去;

(2)用线程池中的线程来处理任务,处理完成后回收线程而不是销毁线程;

(3)设计等待队列来存放来不及处理的任务;

3.JDK中的线程池:

(1) 创建线程池的方式:

        Executors.newSingleThreadExecutor();  //单线程线程池
        Executors.newFixedThreadPool(3); //固定线程线程池
        Executors.newCachedThreadPool();// 可变大小线程池
        Executors.newScheduledThreadPool(3); 定时任务线程池

(2) 创建线程池的参数:

 corePoolSize:线程池的大小。线程池创建之后不会立即去创建线程,而是等待线程的到来。当当前执行的线程数大于改值是,线程会加入到缓冲队列;
maximumPoolSize:线程池中创建的最大线程数;
keepAliveTime:空闲的线程多久时间后被销毁。默认情况下,改值在线程数大于corePoolSize时,对超出corePoolSize值得这些线程起作用。
unit:TimeUnit枚举类型的值,代表keepAliveTime时间单位,可以取下列值:
       TimeUnit.DAYS; //天
  TimeUnit.HOURS; //小时
  TimeUnit.MINUTES; //分钟
  TimeUnit.SECONDS; //秒
  TimeUnit.MILLISECONDS; //毫秒
  TimeUnit.MICROSECONDS; //微妙
  TimeUnit.NANOSECONDS; //纳秒
workQueue:阻塞队列,用来存储等待执行的任务,决定了线程池的排队策略,有以下取值:
  ArrayBlockingQueue;
  LinkedBlockingQueue;
  SynchronousQueue;
  threadFactory:线程工厂,是用来创建线程的。默认new Executors.DefaultThreadFactory();
handler:线程拒绝策略。当创建的线程超出maximumPoolSize,且缓冲队列已满时,新任务会拒绝,有以下取值:
  ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 
  ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 
  ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
  ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

你可能感兴趣的:(线程池,JDK源码,面试)