对线面试官-线程池(二)

2023-06-28 15:12:36 浏览数 (1)

面试官线程池有哪些执行方法?

派大星:线程池有两种执行方法,分别是execute()和submit()。

面试官:那么execute()和submit()有什么区别呢?

派大星:从提交的任务类型角度来看,execute()只能提交Runnable类型的任务,而submit()既能提交Runnable类型的任务,也能提交Callable类型的任务。此外,从API层面理解,execute()是在Executor接口中定义的,而submit()方法是在ExecutorService接口中定义的,具体的实现是由AbstractExecutorService进行。

面试官那么execute()和submit()在异常处理方面有什么区别吗?

派大星:execute()会直接抛出任务执行时的异常,可以使用try catch来捕获,和普通线程的处理方式完全一致。而submit()会吃掉异常,可以通过Future的get方法将任务执行时的异常重新抛出。

面试官那么execute()和submit()的返回值有什么区别呢?

派大星:execute()没有返回值,而submit()有返回值。

面试官从API层面来看,execute方法和submit方法的实现有什么不同呢?

派大星:

execute是在Executor接口中定义的。ThreadPoolExecutor()中并没有定义,但是ThreadPoolExecutor类继承了AbstractExecutorService抽象类,而该抽象类实现了ExecutorService接口,ExecutorService接口又继承了Executor接口。 总结:也就是说ThreadPoolExecutor实现了execute()方法,

具体来说,AbstractExecutorService类中submit方法被重载了三次,分别接受Runnable、Callable和Runnable和ResultHandler类型的参数。而ThreadPoolExecutor类中只实现了接受Runnable类型参数的execute方法。另外,submit方法会返回一个Future对象,而execute方法没有返回值。

面试官那么如果我不需要一个结果,直接用execute()会有什么好处吗?

派大星:如果提交的任务不需要一个结果的话直接用execute()会提高性能。因为submit()底层调用的时候,又将任务交给了execute()方法。

面试官派大星,你能否再详细解释一下为什么说如果提交的任务不需要一个结果的话直接用execute()会提高性能呢?

派大星:当我们使用submit()方法提交任务时,会返回一个Future对象,通过这个对象我们可以在任务执行完毕后获取执行结果。而execute()方法不会返回这个Future对象,所以如果我们提交的任务不需要一个结果,直接使用execute()方法,就可以避免创建这个Future对象,从而提高性能。因为创建和管理这个Future对象也会带来一定的开销。

面试官非常好的解释,那如果我提交的任务需要一个结果,使用submit()方法和execute()方法有什么区别呢?

派大星:如果提交的任务需要一个结果,那么使用submit()方法是比较好的选择,因为它会返回一个Future对象,我们可以通过这个对象在任务执行完毕后获取执行结果。而使用execute()方法提交任务时,我们需要自己通过其他方式来获取任务执行结果,比如使用共享变量或者使用回调函数等方式。

0 人点赞