Java并发线程池

本文深入剖析了Java线程池的工作原理,包括newCachedThreadPool、newFixedThreadPool和newSingleThreadPool的特点及应用场景。核心线程数、最大线程数、线程存活时间等关键参数对线程池行为的影响被详细阐述,同时介绍了线程池的拒绝策略。此外,execute和submit方法的区别以及run和start方法的不同也进行了对比说明。
摘要由CSDN通过智能技术生成

newCachedThreadPool:可复用线程池,线程数量无限制,容易cpu100%,队列并非无界队列,相较而言最不容易出现OOM

newFixedThreadPool:固定大小线程池,无边界阻塞队列,容易内存溢出(OOM)

newSingleThreadPool:只有一个线程

线程池核心参数:

corePoolSize:核心线程数。默认情况下,核心线程会一直存活,但是当将allowCoreThreadTimeout设置为true时,核心线程也会超时回收。

maximumPoolSize:线程池所能容纳的最大线程数。当活跃线程数达到该数值后,后续的新任务将会阻塞。

keepAliveTime:线程闲置超时时长。如果超过该时长,非核心线程就会被回收。如果将allowCoreThreadTimeout设置为true时,核心线程也会超时回

unit:指定keepAliveTime参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。

workQueue:任务队列。通过线程池的execute()方法提交的Runnable对象将存储在该参数中。其采用阻塞队列实现。

threadFactory:线程工厂。用于指定为线程池创建新线程的方式。

handler:拒绝策略。当达到最大线程数时需要执行的饱和策略。

线程池工作原理

1. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:

a) 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;

b) 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;

c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要

创建非核心线程立刻运行这个任务;

d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池

会抛出异常 RejectExecutionException。

2. 当一个线程完成任务时,它会从队列中取下一个任务来执行。

3. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

4.当设置allowCroeThreadTimeOut=true时,任何空闲时间超过keepaliveTime的线程都会被销毁

(macxia查看继承关系图快捷键:command+option+shift+u)

 execute和submit的区别

1、submit中调用了execute方法,submit有返回值,execute无返回值

2、可以接受的任务类型不同,execute只能接受Runnable类型的任务,submit不仅可以接受Runnable还可以接受Callable的任务

3、submit可以进行exception处理

run和start的区别

run方法:普通方法,直接在当前线程中去执行run()方法

start方法:创建一个新线程去执行run方法
 

提交优先级:就是先交付核心线程、等待队列、非核心线程

线程池内部调用过程 

执行优先级 :核心线程、非核心线程、等待队列

在内部调用过程中,队列的优先级是最低的(这个逻辑从源码中可以看出):

拒绝策略:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值