zoukankan      html  css  js  c++  java
  • ExecutorService中submit()和execute()的区别

      在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不清submit()和execute()的区别,今天从源码方面分析总结一下。

      通常,我们通过Executors这个工具类提供多种方法来创建适合不同场景的线程池,这里就不一一介绍了。

      例如,创建可缓存线程池,Executors.newCachedThreadPool(),源码如下:

    1 public static ExecutorService newCachedThreadPool() {
    2         return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
    3                                       60L, TimeUnit.SECONDS,
    4                                       new SynchronousQueue<Runnable>());
    5     }

      通过上面源码可以看出,该方法返回的是一个ExecutorService接口,而这个接口继承Executor接口,Executor是最上层的,其中只包含一个execute()

    方法:

    public interface Executor {
        void execute(Runnable command);
    }

      execute()方法的入参为一个Runnable,返回值为void,这时候我们已经知道了execute()方法的来源以及其定义。

      接下来,我们来看看,submit()是从哪来的呢?

      通过猜测,应该是ExecutorService接口中的,果然,打开源码,看到了submit()方法:

    1 public interface ExecutorService extends Executor {
    2   ...
    3   <T> Future<T> submit(Callable<T> task);
    4 
    5   <T> Future<T> submit(Runnable task, T result);
    6 
    7   Future<?> submit(Runnable task);
    8   ...
    9 }

      可以看出,在ExecutorService接口中,一共有以上三个sumbit()方法,入参可以为Callable<T>,也可以为Runnable,而且方法有返回值Future<T>;

      (补充说明:Callable<T>与Runnable类似,也是创建线程的一种方式,实现其call()方法即可,方法可以有返回值,而且方法上可以抛出异常;)

      总结,从上面的源码以及讲解可以总结execute()和submit()方法的区别:

      1. 接收的参数不一样;

      2. submit()有返回值,而execute()没有;

        例如,有个validation的task,希望该task执行完后告诉我它的执行结果,是成功还是失败,然后继续下面的操作。

      3. submit()可以进行Exception处理;

        例如,如果task里会抛出checked或者unchecked exception,而你又希望外面的调用者能够感知这些exception并做出及时的处理,那么就需要用到submit,通过对Future.get()进行抛出异常的捕获,然后对其进行处理。

  • 相关阅读:
    BGP--边界网关协议
    Paris Traceroute
    网站flash黑屏问题
    org.pentaho.di.ui.core.widget.PasswordTextVar
    java 金额计算,商业计算 double不精确问题 BigDecimal,Double保留两位小数方法
    spring mvc 利用匿名内部类构建返回json对象
    bootstrap3-typeahead 自动补全
    高德地图 省市区商圈数据
    小米wifi远程提交下载任务地址
    国外HTML网站模版(卖成品模版)
  • 原文地址:https://www.cnblogs.com/printN/p/6973815.html
Copyright © 2011-2022 走看看