线程池中的execute方法你们都不陌生,即开启线程执行池中的任务。java
还有一个方法submit也能够作到,它的功能是提交指定的任务去执行而且返回Future对象,即执行的结果。小程序
下面简要介绍一下二者的三个区别:ide
一、接收的参数不同this
二、submit有返回值,而execute没有线程
用到返回值的例子,好比说我有不少个作validation的task,我但愿全部的task执行完,而后每一个task告诉我它的执行结果,是成功仍是失败,若是是失败,缘由是什么。
而后我就能够把全部失败的缘由综合起来发给调用者。code
我的以为cancel execution这个用处不大,不多有须要去取消执行的。对象
而最大的用处应该是第二点。
三、submit方便Exception处理
意思就是若是你在你的task里会抛出checked或者unchecked exception,
而你又但愿外面的调用者可以感知这些exception并作出及时的处理,那么就须要用到submit,经过捕获Future.get抛出的异常。get
下面一个小程序演示一下submit方法 it
public class RunnableTestMain { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(2); /** * execute(Runnable x) 没有返回值。能够执行任务,但没法判断任务是否成功完成。 */ pool.execute(new RunnableTest("Task1")); /** * submit(Runnable x) 返回一个future。能够用这个future来判断任务是否成功完成。请看下面: */ Future future = pool.submit(new RunnableTest("Task2")); try { if(future.get()==null){//若是Future's get返回null,任务完成 System.out.println("任务完成"); } } catch (InterruptedException e) { } catch (ExecutionException e) { //不然咱们能够看看任务失败的缘由是什么 System.out.println(e.getCause().getMessage()); } } } public class RunnableTest implements Runnable { private String taskName; public RunnableTest(final String taskName) { this.taskName = taskName; } @Override public void run() { System.out.println("Inside "+taskName); throw new RuntimeException("RuntimeException from inside " + taskName); } }