Java 中 `ThreadPoolExecutor` 的 `submit()` 和 `execute()` 方法

简介: 【8月更文挑战第22天】

ThreadPoolExecutorjava.util.concurrent 包中用于管理线程池的类。submit()execute() 都是 ThreadPoolExecutor 类中用于向线程池提交任务的方法,但它们有一些关键的区别。

submit() 方法

  • 返回一个 Future 对象,该对象表示正在执行或已完成的任务的结果。
  • 允许检查任务的状态(例如是否已完成或是否已取消)。
  • 允许从任务中获取结果或等待结果。
  • 可以抛出 RejectedExecutionException,如果线程池已关闭或无法处理任务。

execute() 方法

  • 不返回任何值。
  • 不允许检查任务的状态或获取结果。
  • 不会抛出异常(如果线程池已关闭或无法处理任务,则任务将被丢弃)。

何时使用 submit()

使用 submit() 方法的常见场景包括:

  • 当需要检查任务的状态或获取结果时。
  • 当需要处理可能被拒绝的任务时。
  • 当需要跟踪任务的进度或取消任务时。

何时使用 execute()

使用 execute() 方法的常见场景包括:

  • 当不需要检查任务的状态或获取结果时。
  • 当任务不应被拒绝时(例如,当线程池无界时)。
  • 当任务不需要进度跟踪或取消时。

示例

以下示例演示了 submit()execute() 方法之间的区别:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolExample {
   
    public static void main(String[] args) {
   
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 使用 submit() 提交一个任务并获取结果
        Future<Integer> future = executorService.submit(() -> {
   
            // 任务代码
            return 42;
        });

        // 使用 execute() 提交一个任务,不获取结果
        executorService.execute(() -> {
   
            // 任务代码
            System.out.println("任务已完成");
        });

        // 检查任务状态并获取结果
        try {
   
            Integer result = future.get();
            System.out.println("任务结果:" + result);
        } catch (Exception e) {
   
            e.printStackTrace();
        }

        executorService.shutdown();
    }
}

输出:

任务已完成
任务结果:42

结论

submit()execute() 方法都是向 ThreadPoolExecutor 提交任务的有效方法。选择哪种方法取决于应用程序的具体需求。如果需要检查任务的状态或获取结果,则应使用 submit() 方法。如果不需要这些功能,则可以使用 execute() 方法。

目录
相关文章
|
3天前
|
Java
Java的方法详解
Java的方法是类中的重要组成部分,用于定义类的行为。方法可以接收参数、执行操作并返回结果。其基本语法包括返回类型、方法名、参数列表和方法体。方法支持重载,即同名但参数不同的多个方法;静态方法则直接通过类名调用,无需实例化。此外,Java还支持可变参数,允许方法接收不定数量的参数。通过访问修饰符如`public`、`protected`、`private`,可以控制方法的可见性。方法是实现类功能的基本单元,增强了程序的灵活性和复用性。
|
10天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
15天前
|
Java
用JAVA架建List集合为树形结构的代码方法
这段代码定义了一个表示树形结构的 `Node` 类和一个用于构建树形结构的 `TreeController`。`Node` 类包含基本属性如 `id`、`pid`、`name` 和 `type`,以及子节点列表 `children`。`TreeController` 包含初始化节点列表并将其转换为树形结构的方法。通过过滤和分组操作实现树形结构的构建。详情可见:[代码示例链接1](http://www.zidongmutanji.com/zsjx/43551.html),[代码效果参考链接2](https://www.257342.com/sitemap/post.html)。
25 5
|
17天前
|
安全 Java 开发者
【技术咖必看】Java异常处理新境界:throws关键字,打造万无一失的方法签名!
【技术咖必看】Java异常处理新境界:throws关键字,打造万无一失的方法签名!
30 3
|
17天前
|
安全 Java 程序员
【程序猿逆袭指南】Java高手的秘密武器:throws关键字,让你的方法签名霸气侧漏!
【程序猿逆袭指南】Java高手的秘密武器:throws关键字,让你的方法签名霸气侧漏!
13 3
|
18天前
|
Java Spring 容器
Java获取接口的所有实现类方法
这篇文章介绍了在Java中获取接口所有实现类的方法,包括使用JDK的ServiceLoader(SPI机制)和Spring Boot中的@Autowired自动注入及ApplicationContextAware接口两种方式。
40 1
|
19天前
|
监控 Java API
提升 Java 后台性能的十大方法
提升 Java 后台性能的十大方法
31 2
|
21天前
|
安全 Java 应用服务中间件
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
|
1天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
6 0
|
14天前
|
Java 开发者
探索Java中的Lambda表达式:简化代码的现代方法
【8月更文挑战第31天】Lambda表达式在Java 8中首次亮相,为Java开发者提供了一种更简洁、灵活的编程方式。它不仅减少了代码量,还提升了代码的可读性和可维护性。本文将通过实际示例,展示Lambda表达式如何简化集合操作和事件处理,同时探讨其对函数式编程范式的支持。