线程池提交任务 execute 和 submit,到底选哪个?

关于线程池,写过两篇文章《线程池基本原理详解》、《定时类线程池工作原理》。

这两篇文章,从源码的角度,分析的很详细,文章也很长。

这一篇,介绍一个很小的点,使用线程池时,任务提交的方法,

execute 和 submit 这两个到底怎么选?

一、示例代码

先说 Runnable任务,可以这么写


    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("test runnable");
        }
    };

JAVA8 之后可以这么写


   Runnable runnable2 = () -> {
       System.out.println("test runnable2");
   };

同样的Callable 任务,可以这么写


   Callable<Integer> callable = new Callable<Integer>() {
       @Override
       public Integer call() throws Exception {
           return 1 + 1;
       }
   };

   Callable<Integer> callable1 = () -> {
       return 1 + 1;
   };

言归正传,写个示例代码


  public static void main(String[] args) throws Exception {
      ExecutorService pool = Executors.newFixedThreadPool(2);
      Future<Integer> future = pool.submit(() -> {
          return 1 + 1;
      });

      pool.execute(() -> {
          System.out.println("test runnable2");
      });
      pool.shutdown();
  }

直观的说,submit 是有返回值的, execute 没有返回值

二、submit 源码

submit 的顶层接口在 ExecutorService 中定义的

    <T> Future<T> submit(Callable<T> task);

在抽象类 AbstractExecutorService 中,实现了 submit 方法

  public Future<?> submit(Runnable task) {
      if (task == null) throw new NullPointerException();
      RunnableFuture<Void> ftask = newTaskFor(task, null);
      execute(ftask);
      return ftask;
  }

这个方法很简洁,submit 方法,将任务包装成 FutureTask 对象 ,传入 execute 方法,最终将 任务对象返回(可获取任务执行的结果)。

    void execute(Runnable command);

execute 方法,在ThreadPoolExecutor 中实现,在《线程池基本原理详解》中,有详细讲解,这里不展开说了。

在这里插入图片描述
从代码层面,两者的区别很明显。

submit 方法和 execute 功能差不多,都是提交任务。不同的是,submit 包装了任务后,才调用execute,并返回了任务本身(可获取任务执行结果)。

三、总结

线程池提交任务,有 execute 和 submit 两种方法,差别不大。

execute 没有返回值,仅处理 Runnable 任务。

submit 有返回值, Runnable 、Callable 任务都能处理。

至于 Runnable 任务和 Callable 任务有什么区别,本篇就不说了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值