初学者-ThreadPoolExecutor的线程池相关知识

一、ThreadPoolExecutor的线程池中的七个参数解释。(四个构造方法)

1、corePoolSize-核心线程数

      在线程池空闲时,池中运行的线程数;在线程池队列没有满时,池中运行的线程数;

2、maxPoolSize-最大线程数

     在线程池中的线程数量等于核心线程且工作队列已满时,线程池会创建新的线程直到该最大的线程数。当再有线程进来的时候,将拒绝新进线程抛出异常(看rejectHandler如何设置)

3、keepAliveTime-线程(核心线程外的线程)存活时间

     核心线程以外的线程在线程池中存活时间。(如果allowCoreThreadTimeout设置为true,则所有线程均会在存活时间后退出直到为零,一般设置为false)

4、unit-存活时间的单位

     空闲线程存活时间单位

5、workQueqe - 工作队列

     总有四种队列:ArrayBlockingQueueLinkedBlockingQueneSynchronousQuenePriorityBlockingQueue;

     ArrayBlockingQueue:有界队列,可以设置队列大小。如果队列满了,将触发线程池中的RejectedHandler策略;

     LinkedBlockingQuene: 无界队列,可以向该队列无限添加任务,直到内存溢出;

     SynchronousQuene:阻塞队列。可以简单理解成容量只有1的队列,每个put都必须等到一个take。Executers.newCachedThreadPool使用的这个队列;     

     PriorityBlockingQueue:优先级队列。线程池会优先选取优先级高的任务执行,队列中的元素需要继承comparable接口。

6、threadFactory - 线程工厂

     用来设置线程名、是否为daemon线程。

    CustomizableThreadFactory:ThreadFactory threadFactory = new CustomizableThreadFactory("thread-factory-pool-");

    ThreadFactoryBuilder:ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-factory-pool-").build();

    BasicThreadFactory: ThreadFactory threadFactory = new BasicThreadFactory.Builder.namingPattern("thread-factory-pool-").build();

    上述实质等于 Thread thread = new Thread();   thread.setName("thread-factory-pool-");

7、rejectHandler - 拒绝策略

     总共有四种拒绝策略:CallerRunsPolicy,  AbortPolicy,  DiscardPolicy,  DiscardOldestPolicy

     CallerRunsPolicy:如果添加失败,将由主线程代理执行executor方法;

     AbortPolicy:如果添加失败,将抛出异常RejectedExecutionException;(线程池默认策略)

     DiscardPolicy:如果添加失败,直接丢弃掉,不抛弃异常;     

     DiscardOldestPolicy:如果添加失败,将队列中最早添加的元素移除,再次添加,如果添加失败继续上述操作;

二、JDK四个预定义线程池(jdk1.5之后)

1、newFixedThreadPool-固定数量的线程池

     它是一种固定大小的线程池。corePoolSize和maximunPoolSize都为用户设定的线程数量nThreads,keepAliveTime为0,意味着一旦有多余的空闲线程,就会被立即停止掉;但这里keepAliveTime无效。阻塞队列采用了LinkedBlockingQueue,它是一个无界队列;由于阻塞队列是一个无界队列,因此永远不可能拒绝任务。由于采用了无界队列,实际线程数量将永远维持在nThreads,因此maximumPoolSize和keepAliveTime将无效。

public static ExecutorService newFixedThreadPool(int nThreads){
    return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue());
}

2、newCachedThreadPool-缓存线程池

      它比较适合处理执行时间比较小的任务;corePoolSize为0,maximumPoolSize为无限大,意味着线程数量可以无限大;keepAliveTime为60S,意味着线程空闲时间超过60S就会被杀死;采用SynchronousQueue装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理他,如果当前没有空闲的线程,那么就会再创建一条新的线程。

public static ExecutorService newCachedThreadPool(){
    return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.MILLISECONDS,new SynchronousQueue());
}

3、scheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }

定时功能实现:scheduleAtFixedRate(command, initialDelay, period, unit) 

command: 执行的线程(可自己New一个)

initialDelay:初始化执行的延时时间

period: 时间间隔

unit : 时间类型

stThread.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(new Date());
            }
        }, 20, 2, TimeUnit.SECONDS);

延时功能实现:

callable:回调方法

delay:延时时间

unit:时间类型 , 同定时器的unit一样

stThread.schedule((RolePrvlegeTask)SpringUtils.getBean("rolePrvlegeTask"), 1, TimeUnit.SECONDS);
 

4、SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor(){
    return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue());
}

你可能感兴趣的:(线程池,java)