Java线程池ThreadPoolExecutor原理和用法

1.ThreadPoolExecutor构造方法

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
        BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
corePoolSize:核心池的大小;
maximumPoolSize:线程池最大线程数;
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止;
unit:参数keepAliveTime的时间单位(TimeUnit);
workQueue:一个阻塞队列,用来存储等待执行的任务;
threadFactory:线程工厂,主要用来创建线程;
handler:表示当拒绝处理任务时的策略,有以下四种取值:
(1)AbortPolicy丢弃任务并抛出RejectedExecutionException异常,默认策略
(2)DiscardPolicy:也是丢弃任务,但是不抛出异常
(3)DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务
(4)CallerRunsPolicy:由调用线程处理该任务(不创建新线程)
 
2.ThreadPoolExecutor原理
 
ThreadPoolExecutor创建后,执行execute方法,
如果运行线程数小于corePoolSize,创建线程执行任务;
如果运行线程数大于corePoolSize且小于maximumPoolSize,则将任务放到workQueue队列中;
如果运行线程数大于corePoolSize且小于maximumPoolSize,workQueue队列满了,创建线程执行任务;
如果运行线程数大于corePoolSize且等于maximumPoolSize,workQueue队列满了,执行拒绝策略(默认策略是抛出异常停止运行);
 
3.ThreadPoolExecutor用法
ThreadPoolExecutor构造方法参数比较多,每个参数设置需要一定的经验。一般情况下可以使用Executors类来创建:
 
newSingleThreadExecutor()   创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
newFixedThreadPool(int nThreads) 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newCachedThreadPool() 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲(60秒无任务)线程,若无可用线程,则新建线程。
 
(1)新建Task类
package com.xkzhangsan.threads.pool;

public class Task implements Runnable{
    
    private String name;

    public Task(String name) {
        super();
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("task:"+name+" start...");
    }

}

(2)创建测试类使用Executors.newCachedThreadPool() 创建线程池。

package com.xkzhangsan.threads.pool;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class Main {
    
    public static void main(String[] args) {
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            Task task = new Task("task"+i);
            executor.execute(task);
        }
    }

}

(3)测试结果

task:task0 start...
task:task1 start...
task:task2 start...
task:task3 start...
task:task4 start...
task:task5 start...
task:task6 start...
task:task7 start...
task:task9 start...
task:task8 start...
 
寻找撬动地球的支点(解决问题的方案),杠杆(Java等编程语言)已经有了。xkzhangsan
原文地址:https://www.cnblogs.com/xkzhangsanx/p/10787248.html