java thread构造方法,ThreadPoolExecutor的构造方法详解以及应急线程的解释

线程池状态

// 线程池的控制状态,用高3位来表示线程池的运行状态,低29位来表示线程池中工作线程的数量

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

private static final int COUNT_BITS = Integer.SIZE - 3; // 29

// 高三位来表示线程的运行状态

private static final int RUNNING = -1 << COUNT_BITS;

private static final int SHUTDOWN = 0 << COUNT_BITS;

private static final int STOP = 1 << COUNT_BITS;

private static final int TIDYING = 2 << COUNT_BITS;

private static final int TERMINATED = 3 << COUNT_BITS;

cb685fa57145804b185c88c3028967e2.png

构造方法

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

corePoolSize:表示核心线程数的数量

maximumPoolSize:表示最大的线程数

keepAliveTime:表示应急线程的存活时间

unit:表示应急线程的存活时间的单位

workQueue:阻塞队列,就是线程忙不过来的时候,任务要在队列里排队

threadFactory:线程工厂,可以为线程创建的时候起个好名字

handler:拒绝策略

keepAliveTime和unit是针对应急线程的,那么什么是应急线程呢?

先说一下线程池里线程的类型。

核心线程

应急线程

以下代码,我在线程池里放了2个核心线程,最大线程数为3(也就是说应急线程为1),阻塞队列的容量为2,此时运行下面的代码查看结果。

public static void main(String[] args) {

ThreadPoolExecutor pool = new ThreadPoolExecutor(2,3,1000L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(2));

pool.execute(() -> {

try {

System.out.println("第一个任务");

Thread.sleep(1000000L);

} catch(InterruptedException e) {

e.printStackTrace();

}

});

pool.execute(() -> {

try {

System.out.println("第二个任务");

Thread.sleep(1000000L);

} catch(InterruptedException e) {

e.printStackTrace();

}

});

pool.execute(() -> {

try {

System.out.println("第三个任务");

Thread.sleep(1000000L);

} catch(InterruptedException e) {

e.printStackTrace();

}

});

pool.execute(() -> {

try {

System.out.println("第四个任务");

Thread.sleep(1000000L);

} catch(InterruptedException e) {

e.printStackTrace();

}

});

}

fabcd96ba53c4420f051304096b48028.png

发现只有两个任务被线程消费了,但是不是有三个线程吗???另一个线程不工作???

这两个任务是被两个核心线程消费的,而剩余的两个任务被放到阻塞队列里(阻塞队列的容量是2),这时候的情况不算“应急”的情况,所以应急线程并没有启动。

那什么时候算“应急”??

此时我们再加一个任务瞅瞅,2个核心线程在工作,空间为2的队列也满了,多出来来的任务怎么办呢??应急线程会出手吗?

pool.execute(() -> {

try {

System.out.println("第五个任务");

Thread.sleep(100000L);

} catch(InterruptedException e) {

e.printStackTrace();

}

});

查看结果发现三个任务被消费了~其实是应急线程出来应急了。

f0944ea905f7b9e7af9c6388ad430179.png

总结一下:如果队列选择了有界队列,而任务超过了队列大小时,会创建 maximumPoolSize - corePoolSize 数目的应急线程来救急。而应急当然就是救急用的,所以当高峰过去而没有任务做,就会被结束,由keepAliveTime 和 unit 来控制。

拒绝策略

如果任务量特别多,核心线程+应急线程(maximumPoolSize )+ 队列大小都撑不住,这时候就会执行拒绝策略了。

AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;

CallerRunsPolicy:由调用execute方法的线程执行该任务;

DiscardPolicy:丢弃任务,但是不抛出异常;

DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)。

实现RejectedExecutionHandler接口,自定义相关处理的过程,如记录日志或持久化存储不能处理的任务。

提交任务

// 执行一个任务

void execute(Runnable command)

// submit实质还是执行了execute方法,获取返回结果

Future> submit(Runnable task)

Future submit(Runnable task, T result)

Future submit(Callable task)

//执行所有的任务

List> invokeAll(Collection extends Callable> tasks) throws InterruptedException;

List> invokeAll(Collection extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException

// 提交 tasks 中所有任务,哪个任务先成功执行完毕,返回此任务执行结果,其它任务取消

T invokeAny(Collection extends Callable> tasks) throws InterruptedException, ExecutionException

T invokeAny(Collection extends Callable> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

本文地址:https://blog.csdn.net/axiang_/article/details/107341060

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值