欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 20:22:43
一、spring的线程池中的七个参数解释。...

一、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<Runnable>());
}

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<Runnable>());
}

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<Runnable>());
}

本文地址:https://blog.csdn.net/Sorry_No_konw/article/details/113954820

相关标签: 线程池 java