江明涛的博客
使用 Callable 和 Future 获取线程返回值
使用 Callable 和 Future 获取线程返回值

使用 Callable 和 Future 获取线程返回值

在Java的多线程编程中,我们经常需要创建并发执行的任务,并且希望能够获取任务的返回值。使用Callable和Future是一种实现这一目标的常用方式。

Callable接口

Callable接口是java.util.concurrent包下的一个接口,它定义了一个call()方法,可以在执行任务时返回结果。与Runnable接口不同,call()方法可以抛出异常,并且可以返回结果。

public interface Callable<V> {
    V call() throws Exception;
}

Future接口

Future接口是Java提供的一个接口,表示一个异步计算的结果。Future接口提供了方法来检查计算是否完成,等待计算完成,并获取计算的结果。

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}

使用Callable和Future

要使用Callable和Future获取线程的返回值,我们首先需要创建一个Callable对象,然后将其提交给一个ExecutorService进行执行。ExecutorService负责管理线程池,并返回一个Future对象,通过Future对象可以获取Callable的返回值。

import java.util.concurrent.*;
public class ThreadExample {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Callable<Integer> callable = new MyCallable();
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Future<Integer> future = executorService.submit(callable);
        // do other things
        Integer result = future.get();
        System.out.println("Result: " + result);
        executorService.shutdown();
    }
    static class MyCallable implements Callable<Integer> {
        public Integer call() throws Exception {
            // perform some computation
            return 42;
        }
    }
}

在上面的例子中,我们创建了一个MyCallable类实现Callable接口,并在call()方法中进行了一些计算,最后返回了一个整数。然后我们创建了一个ExecutorService,并将MyCallable对象提交给它进行执行。通过调用submit()方法,我们得到了一个Future对象,通过调用Future的get()方法,我们可以获取到MyCallable的返回值。

使用Callable和Future可以很方便地获取线程的返回值,并且可以对任务进行异常处理。这在多线程编程中非常有用,可以帮助我们更好地管理并发任务,提高程序的性能与可靠性。