Java线程池的submit和execute方法区别

线程池中的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);
    }

}
相关文章
相关标签/搜索