搜索
写经验 领红包
 > 家居

线程池怎么实现(线程池提交线程)

导语:初级面试:如何向线程池提交任务,提交任务有几种方式有什么区别

线程池怎么实现(线程池提交线程)

前言:随着项目的业务加重,单线程已经不能满足我们的需求,衍生出来线程池帮我们解决一些问题,如:处理大量数据,处理文件,减少程序处理时间等。不理解概念的可以看下我前面的文章《面试官问你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方法时阻塞的。

本文内容由小快整理编辑!