java线程池

线程池的由来:

1、某些功能业务需要多个线程之间的配合,提高任务处理效率(多线程并行)、资源利用率等(线程复用减少了线程创建销毁消耗的资源),以减少时间成本或者说程序响应时间。
2、对多线程的管理就形成了以线程创建、分配、复用、销毁为核心的线程池系统。

线程池的作用:

1、合理地对一组线程进行统一管理,如线程创建、分配、复用、销毁等。
2、线程并行处理和复用提高了任务处理效率和资源利用率等

线程池的运行原理简图:

java线程池_第1张图片

 ThreadPoolExecutor线程池执行线程任务源码和执行流程图:

    public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }

java线程池_第2张图片

线程池的七大参数:

线程相关
参数名 参数含义
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 空闲线程存活时间
unit keepAliveTime的单位
threadFactory 创建线程的工厂
任务队列
workQueue 存放线程任务的阻塞队列
拒绝策略
handler 拒绝策略

线程池类六种常见线程工厂类型:

SingleThreadExecuter 单一线程池,核心线程=最大线程=1
SingleThreadScheduledExecuter 单一定时任务线程池
ScheduledThreadPool 指定核心线程数的定时任务线程池
CacheThreadPool 核心线程数为0,最大线程为Integer.MAX_VALUE的线程池
FixedThreadPool 核心线程等于最大线程数,且线程数固定(线程数+任务数≤最大线程)
ForkJoinPool 可拆分任务并合并结果的线程池

线程池参数对比图:

Single

ThreadExecuter

Single

ThreadScheduledExecuter

Scheduled

ThreadPool

Cache

ThreadPool

Fixed

ThreadPool

corePoolSize 1 1 构造函数传入 0 构造函数传入
maxPoolSize 1 Integer. MAX_VALUE Integer. MAX_VALUE Integer. MAX_VALUE 构造函数传入
keepAliveTime 0 0 0 60 0

线程池的五种运行状态:

RUNNING 可以添加新任务、可以执行已有的任务
SHUTDOWN 不可以添加新任务,可以执行已有的任务
STOP 不可以添加新任务,不可以执行已有的任务,中断当前任务
TYDYING 所有任务已终止,记录工作线程数量的原子变量ctl数值为0
TERMINATED 线程池彻底终止

五种状态切换图:

java线程池_第3张图片

线程池的四种拒绝策略:

AbortPolicy(默认) 中止策略,线程池抛出异常并中止此任务
CallerRunsPolicy 调用者运行策略,任务交给添加任务的Main线程执行
DiscardPolicy 丢弃策略,不予任何处理
DiscardOldestPolicy 弃旧换新略,抛弃队列中等待最久的任务,然后把当前任务加入到队列中尝试再次提交当前任务

线程池的参数设置:

计算密集型 cpu+1
I/O密集型 cpu*2

你可能感兴趣的:(java,开发语言)