线程池怎么实现(线程池提交线程)
导语:初级面试:如何向线程池提交任务,提交任务有几种方式有什么区别
前言:随着项目的业务加重,单线程已经不能满足我们的需求,衍生出来线程池帮我们解决一些问题,如:处理大量数据,处理文件,减少程序处理时间等。不理解概念的可以看下我前面的文章《面试官问你java都有哪些线程池,自己是否自定义过线程池》。
向线程池提交任务有俩种:分别为Runnable和Callable。
一、Runnable
这个大家都很熟悉,也是经常使用的
runnable
WorkQueue是我自定义的线程池,可以看见输出了5个Runnable is run,可能有人会质疑我使用的是Thread,并没有使用Runnable
thread
看Thread的源码,Thread实现了Runnable,只要实现了Runnable就可以往线程池提交,那么为什么使用execute方法呢?
execute
因为方法里接收的就是必须是实现Runnable的类。
二、Callable
这个可能比较陌生,他的实现比较麻烦,首先说下如何使用Callable创建一个线程。
Callable
实现Callable接口通过FutureTask包装器来创建Thread线程
实现Callable
FutureTask封装
那么如何通过线程池来实现呢,这里就不需要FutureTask了。也不能使用execute,因为Callable没有实现Runnable。
线程池实现Callable
submit
通过submit提交任务。那么这2者有什么区别呢?Callable支持返回值和异常,而Runnable2者都不支持。如图:
2者区别
可以看出通过get能获取返回值,并且call方法抛出异常,我们在外面可以捕获。而Runnable是没有这2种功能的。总结:
1、向线程池提交任务有2中方式,使用Runnable时,通过execute提交,使用Callable时,使用submit提交。
2、Callable可以有返回值,如何想要获取返回值,只能使用Callable。而起get方法时阻塞的。
本文内容由小快整理编辑!