面试的时候面试官问你线程池创建方式有几种,你内心窃喜霹雳巴拉说了出来,然后面试官又问你线程池的几个重要参数是什么,然后你把你背的几个参数说了出来,
明明已经快打通关了然后面试官问你线程池的提交方式,???然后你沉入思考,然后现入尴尬的氛围中,你看看面试官,面试官看看你,为了解决这种尴尬的局面,
于是这篇文章出生了,这篇文章:感谢面试官!!!:
好了下面言归正传:
线程池提交方式有两种:execute()和submit()
下面看他的构造方法:
两种方式提交的区别:
- execute只能提交Runnable类型的任务,无返回值。submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任务类型为Runnable时,返回值为null。
- execute在执行任务时,如果遇到异常会直接抛出,而submit不会直接抛出,只有在使用Future的get方法获取返回值时,才会抛出异常。
好的,下面开始验证上面的两条理论:首先验证(execute在执行任务时,如果遇到异常会直接抛出)
运行效果如图所示:
继续验证(submit在执行任务时,不会直接抛出异常,只有在使用Future的get方法获取返回值时,才会抛出异常)
运行效果图如下:
下面继续验证callable与submit的情景
运行效果图如下:(只有使用了get获取才会打印报错信息哦)
上面提到了get(),其实这个get()方法在调用的时候是会阻塞的,下面演示代码如图所示:
当执行到get方法时是会阻塞的,只有五秒后执行完毕才会接着往下执行
future的get方法在未获得返回值之前会一直阻塞,一般会使用future的isDone方法判断任务是否执行完成,然后再进行get,如下:
到此就结束了,你是不是对线程池的提交方式有了新的理解了呢,感兴趣的可以扫码关注博主的公众号,会不定期推送优质技术文章的哦