win32线程已退出 返回值为0_线程池没你想的那么简单(续)

本文详细介绍了线程池中任务完成后的通知机制,通过自定义接口实现任务执行完毕的通知。接着探讨了JDK中ExecutorService的shutdown()和awaitTermination()方法的原理。此外,文章还展示了如何在线程池中执行带有返回值的线程,并解析了其实现原理。最后,文章讨论了线程池中的异常处理,强调了任务异常处理的重要性。
摘要由CSDN通过智能技术生成

d1b0ba03ae83c9a72208ac2bfe9642d5.png

前言

前段时间写过一篇《线程池没你想的那么简单》,和大家一起撸了一个基本的线程池,具备:

  • 线程池基本调度功能。

  • 线程池自动扩容缩容。

  • 队列缓存线程。

  • 关闭线程池。

这些功能,最后也留下了三个待实现的 features

  • 执行带有返回值的线程。

  • 异常处理怎么办?

  • 所有任务执行完怎么通知我?

这次就实现这三个特性来看看 j.u.c 中的线程池是如何实现这些需求的。

再看本文之前,强烈建议先查看上文《线程池没你想的那么简单》

任务完成后的通知

大家在用线程池的时候或多或少都会有这样的需求:

线程池中的任务执行完毕后再通知主线程做其他事情,比如一批任务都执行完毕后再执行下一波任务等等。

00166dffdb5dc9ba74df649c053e761b.png

以我们之前的代码为例:

总共往线程池中提交了 13 个任务,直到他们都执行完毕后再打印 “任务执行完毕” 这个日志。

执行结果如下:

9e397730c21a3a22a55d51585c4e84d5.png

为了简单的达到这个效果,我们可以在初始化线程池的时候传入一个接口的实现,这个接口就是用于任务完成之后的回调。

12e7d17f4d5ca227e10e064c26d1bcfe.png

public interface Notify {

/**

* 回调

*/

void notifyListen() ;

}

以上就是线程池的构造函数以及接口的定义。

所以想要实现这个功能的关键是在何时回调这个接口?

仔细想想其实也简单:只要我们记录提交到线程池中的任务及完成的数量,他们两者的差为 0 时就认为线程池中的任务已执行完毕;这时便可回调这个接口。

所以在往线程池中写入任务时我们需要记录任务数量:

bf198e896cc6830a65d9d0dcc3307a31.png

为了并发安全的考虑,这里的计数器采用了原子的 AtomicInteger


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值