开发者

解读线程池中submit()和execute()区别与联系

开发者 https://www.devze.com 2025-06-30 10:24 出处:网络 作者: 找不到、了
目录1、execute1.1、定义1.2、方法1.3、异常处理2、submit2.1、介绍2.2、方法重载形式2.3、异常处理3、核心区别对比总结关于线程池的继承关系可参考:
目录
  • 1、execute
    • 1.1、定义
    • 1.2、方法
    • 1.3、异常处理
  • 2、submit
    • 2.1、介绍
    • 2.2、方法重载形式
    • 2.3、异常处理
  • 3、核心区别对比
    • 总结

      关于线程池的继承关系可参考:

      解读线程池中submit()和execute()区别与联系

      在 Java 的线程池中,submit()和execute()都是用来向线程池提交任务的方法。区别在于任务类型支持返回值异常处理机制

      1、execute

      1.1、定义

      execute()是Executor接口(ExecutorService继承自它)中定义的方法,只能提交Runnable任务,没有返回值不能获取任务执行结果js如果任务抛出异常,异常会由线程池的未捕获异常处理器处理。

      1.2、方法

      execute(Runnable command)

      • 定义:来自Executor接口(ExecutorService继承自它)。
      • 参数:仅接受Runnable类型的任务。
      • 返回值:无返回值(void)。

      代码示例如下:

      ExecutorService threadPool = Executors.newFixedThreadPool(2);
          
      threadPool.execute(()->{
          Swww.devze.comystem.out.println("hello execute");
      });

      1.3、异常处理

      如果Runnable抛出未检查异常(如RuntimeException),线程池会捕获异常并打印堆栈信息,但调用者无法直接获取异常。

      ​
      executor.execute(() -> {
          throw new RuntimeException("Error in execute()");
      });
      // 调用者无法捕获此异常
      
      ​

      2、submit

      2.1、介绍

      submit() 是ExeCutorSevice 接口中定义的方法。

      可以提交Runnable和Callable任务,返回**Future**对象,可以用来获取任务执行结果或取消任务。

      对于**Runnable**任务,返回的**tbhMZnRNFuture****在任务完成后会返回null,**异常会被捕获并存储在Future中,只有在调用Future.get()时才会抛出。

      2.2、方法重载形式

      <T> Future<T> submit(Callable<T> task);
      Future<?> submit(Runnable task);
      <T> Future<T> submit(Runnable task, T result);
      

      参数

      • 支持Runnable和Callable两种任务类型。
      • 如果是Runnable,可以通过第三个参数指定返回值(result)。

      返回值

      • 返回Future对象,用于跟踪任务状态、获取结果或取消任务。

      1、Future<?> submit(Runnable task);

           Future<?> submit = threadPool.submit(() -> {
                  System.out.println("hello submit1");
              });
      
              try {
                  submit.get();
              } catch (Exception e) {
                  e.printStackTrace();
              }

      2、<T> Future<T> submit(Runnable task, T result);

              Future<String> submit1 = threadPool.submit(() -> {
                  System.out.println("hello submit2");
      
              }, "submit");
      
              try {
                  String object = (String) submit1.get();
                  System.out.println("object=="+object);
              } catch (Exception e) {
                  e.printStackTrace();
              }

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

              Future<Integer> submit2 = threadPool.submit(() -> {
                  return 1;
              });
      
              try {
                tbhMZnRN  Integer integer = submit2.get();
                  System.out.println("integer=="+integer);
              } catch (Exception e) {
                  e.printStackTrace();
              }

      2.3、异常处理

      异常会被封装在ExecutionException中,通过Future.get()抛出,调用者可以显式处理。

      Future<?> future = executor.submit(() -> {
          throw new RuntimeException("Error in submit()");
      });
      
      try {
          future.get(); //编程 会抛出 ExecutionException
      } catch (ExecutionException e) {
          System.out.println("Caught exception: " + e.getCause().getMessage());
      }
      

      3、核心区别对比

      解读线程池中submit()和execute()区别与联系

      心得

      解读线程池中submit()和execute()区别与联系

      • 优先使用submit():在大多数实际场景中,submit()提供了更强大的功能(如结果获取、异常处理)。
      • 关闭线程池:任务提交完成后,调用executor.shutdown()或executor.shutdownNow()释放资源。
      • 避免资源泄漏:确保线程池正确关闭,尤其是长期运行的应用程序。

      通过合理选择execute()和submit(),可以灵活控制任务的执行和管理,满足不同业务需求。

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号