1. 使用`Callable`和`Future`接口:
`Callable`接口表示一个可以返回结果的任务。
`Future`接口表示一个可能还没有完成的任务的结果。
可以通过`ExecutorService.submit(Callable)`方法提交`Callable`任务,并返回一个`Future`对象。
然后可以通过`Future.get()`方法获取任务的返回值。
示例代码:
```java
ExecutorService executor = Executors.newFixedThreadPool(1);
Callable
@Override
public Integer call() throws Exception {
return 1 + 2;
}
};
Future
Integer result = future.get();
System.out.println("Result: " + result);
executor.shutdown();
2. 使用`Thread.join()`方法:
通过调用`Thread.join()`方法,主线程可以等待子线程执行完毕并获取其返回值。
示例代码:
```java
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 子线程执行的任务
}
});
thread.start();
thread.join(); // 主线程等待子线程执行完毕
Integer result = // 从子线程获取返回值
System.out.println("Result: " + result);
3. 使用`CountDownLatch`:
`CountDownLatch`是一个同步辅助类,它允许一个或多个线程等待直到一组操作完成。
示例代码:
```java
CountDownLatch latch = new CountDownLatch(1);
new Thread(new Runnable() {
@Override
public void run() {
// 子线程执行的任务
latch.countDown(); // 任务完成后调用countDown()
}
}).start();
latch.await(); // 主线程等待子线程执行完毕
Integer result = // 从子线程获取返回值
System.out.println("Result: " + result);
4. 使用`FutureTask`:
`FutureTask`实现了`RunnableFuture`接口,它代表一个异步计算的结果。可以把它看作一个具有单个结果的`Callable`。
示例代码:
```java
Callable
callableTask = new Callable () { @Override
public Integer call() throws Exception {
return 1 + 2;
}
};
FutureTask
futureTask = new FutureTask<>(callableTask); new Thread(futureTask).start();
Integer result = futureTask.get(); // 获取返回值
System.out.println("Result: " + result);
以上是获取Java多线程返回值的几种常见方法。请选择适合您需求的方法进行实现