4.execute与submit的区别


提交任务的方式一共有两种,分别是execute和submit。

 

今天就来介绍他们两个以及他们的区别。

 

 

首先来看execute,该方法位于executor中,作用是向线程中提交runnable任务。

 

runnable任务大家都知道,他是一个无返回值的任务,也就是他执行完是没有返回结果给你的,所以execute只适合提交无返回值的任务。

 

 

 

 

 

 

如果你的任务是有返回结果的,那么你就得创建callable任务,它是一个有返回值的任务。

 

 

 

 

 

callable任务执行完会将任务执行结果封装到future对象中,

 

 

 

然后反馈给调用者。调用者在通过future对象获取结果。

 

 

 

 

 

待会介绍submit方法时演示这些操作。

回到execute方法本身,提交的任务如果被拒绝,则抛出任务拒绝异常,提交的任务不能为null,否则会抛出空指针异常。

 

 

 

execute

接下来我们就来演示execute的方法,既然要提交一个任务,我们就先编写一个任务。

 

 创建任务

 

任务内容是输出当前线程名称,接下来我们来执行该任务。

 

创建线程池并调用

首先将任务创建出来,然后创建一个线程池,这里我们就以单个线程的线程池为例,接着调用execute方法向线程池中提交该任务,

最后调用shutdown方法关闭线程池。

 

 

至此方法编写完成,整个例子也编写完成执行程序观察执行结果。

 

 

从执行结果来看,程序只输出了一个线程名称。

submit

看完了execute,再来看看submit,该方法位于executorservice接口中,一共有三个submit方法,他们作用稍有不同,

 

 

这里我将三个方法的作用分别列举出来,他们的返回值类型都是future类型,而且都带泛型。任务执行结果就封装在future对象里面。

 

future是一个接口,该接口定义了与任务执行相关的功能,这是future的UML类。

 

 

图,从中我们可以看到它一共有五个可用的方法,这五个方法的作用如图所示,大家简单的看一下,这里就不展开讲了,下一节我们将详细介绍future。

 

 

 

回到submit方法本身,我们介绍第一个submit方法,它的作用是提交runnable任务,Submit方法也可以提交任务方法返回一个future对象都无返回值了,为什么还要返回future对象?是因为future除了获取任务执行结果以外,

还可以观察任务是否执行完毕以及取消任务等等操作。所以future对象你可以选择接收,您可以选择不接收。

 

submit无返回

 

接下来我们来演示该方法,还是沿用之前的例子,将execute的方法改为submit方法。submit方法返回一个future对象,这里我们选择先接收返回值,注意泛型当中的问号是不确定类型,你就全当obj的类型来理解就好了,调用future的get方法。可以获取到任务执行结果,有异常抛出使用try---catch,将其捕获输出任务执行结果,

写上finally代码块,将关闭线程池的操作放入finally代码块中,这样程序无论是正常执行完毕还是发生异常,都将关闭线程池。

 

 

 

例子编写完成执行程序,观察执行结果。

 

 

 

从执行结果来看,程序输出线程名称和null是我们获取的任务执行结果,因为我们提交的是无返回值任务,所以结果为null。如果我们非要给无返回值任务一个结果可不可以?那也是可以的。

submit固定返回

这就是我们要介绍的第二个submit方法.

 

 

 

它的作用就是提交一个runnable任务给线程池,

并且还可以附带一个执行结果。别的任务都是执行完才知道结果的,这个submit方法是执行任务之前都已经知道了任务执行结果,所以它只适用于执行任务的同时还要附带一个参数的场景,该方法依然是返回一个Futurn对象,像这个Futurn对象里面封装的结果就是我们刚刚传递的第二个参数。接下来我们来演示该方法,还是沿用之前的例子,修改提交任务的代码,调用两个参数的submit方法。第二个参数可以传些什么?你可以传对象,你也可以传数字,还可以传字符串,布尔类型也能传。

我们就以字符串为例好了,传递一句任务完成,在任务完成以后打印出来,此时future的类型不再是不确定的类型,而是字符串string类型。获取任务执行结果的代码也需要修改,将object类型改为string类型,因为我们的任务执行结果是string类型。

 

 

 

例子改写完成执行改写后的例子,观察执行结果,从执行结果来看,程序输出任务完成符合预期。

 

 

 submit自定义返回

再介绍最后一个submit的方法,它的作用是提交的任务,也就是有返回值的任务方法,返回一个future。

 

 

 

接下来我们来演示该方法,重新编写一个需要结果的任务resulttask任务内容是计算一加一的值,实现callable接口,一加一的结果是整形,所以泛型的类型是Integer,重写call方法返回一加一的计算结果。至此任务编写完成。

 

执行任务的代码还是沿用之前的,只不过需要将task任务改为刚刚编写的resulttask任务。接下来提交任务的代码也需要修改,将第二个参数删掉,只保留第一个参数。future泛型的类型由string改为integer,

因为任务执行结果就是integer类型,获取任务执行结果的访问值类型也得改,将string改为integer。

 

例子改写完成执行。改写后的程序观察执行结果,从执行结果来看,程序输出二,符合预期。

 

区别

两种提交任务的方式看完了,再来看看它们的区别。从位置说起,execute的方法位于executor的接口中。submit方法位于executorservice接口中.

再来说说提交任务的类别,execute的方法只支持提交任务,而submit方法既支持runnable任务又支持callable任务。

返回值类型方面,Execute方法无返回值,而submit方法返回future对象。这次execute方法和submit方法的区别介绍完了。

 

总结

 

最后总结一下本节内容。本节介绍了提交任务的两种方式,Execute和submit,他们各自支持的任务如图所示,这里就不再赘述了。在实际开发中,Submit这种方式用的比较多,我一般也在用。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM