Java 并发处理任务等待返回

1. 前言

在 Java 开发中,我们经常会遇到需要执行一些耗时的任务,并且需要等待任务执行完成后才能继续执行后续代码的情况。为了提高程序的并发性能,我们可以使用并发处理的方式来同时执行多个任务,并在所有任务都完成后再进行下一步操作。本文将介绍如何使用 Java 并发处理任务,并等待它们的返回结果。

2. 整体流程

下面是整个流程的步骤表格:

步骤 描述
步骤1 创建一个线程池
步骤2 创建一个实现了 Callable 接口的任务
步骤3 提交任务到线程池
步骤4 获取任务执行的结果
步骤5 关闭线程池

接下来,我们将详细介绍每一步的代码实现。

3. 代码实现

步骤1:创建一个线程池

首先,我们需要创建一个线程池,来管理并发执行的任务。使用 java.util.concurrent.Executors 类中的 newFixedThreadPool 方法可以创建一个固定大小的线程池。

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

ExecutorService executorService = Executors.newFixedThreadPool(5);

上述代码创建了一个大小为 5 的线程池。

步骤2:创建一个实现了 Callable 接口的任务

接下来,我们需要创建一个实现了 java.util.concurrent.Callable 接口的任务类。Callable 接口代表一个具有返回值的任务,我们可以通过它的 call 方法来执行任务,并返回一个结果。

import java.util.concurrent.Callable;

public class MyTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        // 执行任务的代码
        return "任务执行完成";
    }
}

在上述代码中,我们定义了一个 MyTask 类,实现了 Callable 接口,并重写了 call 方法。在 call 方法中,我们可以编写我们需要执行的任务的代码,并返回一个结果。

步骤3:提交任务到线程池

现在,我们可以将任务提交到线程池中开始执行了。使用线程池的 submit 方法可以将任务提交到线程池。

MyTask myTask = new MyTask();
executorService.submit(myTask);

上述代码中,我们创建了一个 MyTask 的实例,并通过 executorService.submit 方法将任务提交到线程池。线程池会在后台创建一个线程来执行这个任务。

步骤4:获取任务执行的结果

为了等待任务执行完成并获取结果,我们可以使用 java.util.concurrent.Future 类。Future 类代表一个未来的结果,我们可以使用它的 get 方法来获取任务的返回结果。

Future<String> future = executorService.submit(myTask);
String result = future.get();

上述代码中,我们通过 executorService.submit 方法将任务提交到线程池,并将返回的 Future 对象保存起来。然后,我们可以使用 future.get() 方法来获取任务的返回结果。

步骤5:关闭线程池

在所有任务执行完成后,我们需要关闭线程池,释放资源。使用线程池的 shutdown 方法可以安全地关闭线程池。

executorService.shutdown();

上述代码中,我们调用 executorService.shutdown() 方法来关闭线程池。该方法会等待所有任务执行完成后再关闭线程池。

4. 类图

下面是本文中涉及到的类的类图:

classDiagram
    class ExecutorService {
        <<interface>>
        +execute(Runnable command): void
        +submit(Callable<T> task): Future<T>
        +shutdown(): void
    }
    class Executors {
        +newFixedThreadPool(int nThreads): ExecutorService
    }
    class Callable {
        <<interface>>
        +call(): V
    }
    class MyTask {
        +call(): String
    }
    class Future {
        +get(): V
    }

5. 结语

通过本文,我们学习了如何使用 Java 并发处理任务