Java 等待一个线程返回的结果
在Java中,我们经常需要等待一个线程执行完毕并返回结果。这可以通过使用Future
和Callable
来实现。本文将介绍如何使用这两个类来实现Java中等待一个线程返回的结果。
整体流程
下面是实现这个功能的整体流程:
步骤 | 描述 |
---|---|
1 | 创建一个Callable 实例,该实例将在另一个线程中执行并返回结果 |
2 | 将Callable 实例包装为FutureTask 对象,以便能够使用其get() 方法等待线程完成并获取结果 |
3 | 创建一个线程来执行FutureTask |
4 | 调用get() 方法等待线程执行完毕并获取返回结果 |
接下来我们将逐步讲解如何实现每一步。
第一步:创建一个Callable实例
首先,我们需要创建一个实现了Callable
接口的类,该类将在另一个线程中执行并返回结果。Callable
接口是一个泛型接口,它定义了一个返回结果类型的方法call()
。我们需要实现这个方法并在其中编写我们希望在另一个线程中执行的逻辑。
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
// 在这里编写需要在另一个线程中执行的逻辑
return "这是线程执行的结果";
}
}
在这个例子中,我们创建了一个名为MyCallable
的类,它实现了Callable<String>
接口。call()
方法在另一个线程中执行,并返回一个String
类型的结果。
第二步:包装为FutureTask对象
接下来,我们需要将Callable
实例包装为FutureTask
对象。FutureTask
是RunnableFuture
接口的一个实现类,它实现了Runnable
接口和Future
接口。我们可以通过将FutureTask
传递给一个线程来执行,并使用其get()
方法等待线程完成并获取结果。
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) {
// 创建一个Callable实例
Callable<String> callable = new MyCallable();
// 将Callable实例包装为FutureTask对象
FutureTask<String> futureTask = new FutureTask<>(callable);
}
}
在这个例子中,我们创建了一个Callable
实例callable
,然后将其传递给FutureTask
的构造函数创建一个FutureTask
对象futureTask
。
第三步:创建一个线程执行FutureTask
现在,我们需要创建一个线程来执行FutureTask
对象。FutureTask
实现了Runnable
接口,因此我们可以将其传递给一个线程并调用start()
方法来执行。
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) {
// 创建一个Callable实例
Callable<String> callable = new MyCallable();
// 将Callable实例包装为FutureTask对象
FutureTask<String> futureTask = new FutureTask<>(callable);
// 创建一个线程来执行FutureTask
Thread thread = new Thread(futureTask);
thread.start();
}
}
在这个例子中,我们创建了一个线程thread
,并将futureTask
传递给它的构造函数。然后,我们调用start()
方法来执行线程。
第四步:等待线程执行完毕并获取结果
最后,我们需要等待线程执行完毕并获取结果。我们可以使用FutureTask
的get()
方法来等待线程执行完毕,并返回线程的执行结果。
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) {
// 创建一个Callable实例
Callable<String> callable = new MyCallable();
// 将Callable实例包装为FutureTask对象
FutureTask<String> futureTask = new FutureTask<>(callable);
// 创建一个线程来执行FutureTask
Thread thread = new Thread(futureTask);
thread.start();
try {
// 等待线程执行完毕并获取结果
String result = futureTask.get();
// 打印结果
System.out.println(result);