返回

Java多线程第十三篇:一网打尽Runnable、Callable、Future、RunnableFuture、FutureTask

后端

多线程编程的五位主角:Runnable、Callable、Future、RunnableFuture、FutureTask

Runnable:轻量级的任务封装

Runnable是一个函数式接口,用于将任务包装成可执行的对象。它只有一个方法run(),当调用run()方法时,任务便会被执行。Runnable通常用于处理简单的任务,例如更新UI或执行耗时操作。

Callable:带返回值的任务封装

Callable与Runnable相似,但它有一个返回值。这使得Callable可以用于处理更复杂的任务,例如计算结果或从数据库中检索数据。Callable通常用于处理需要返回值的任务,例如在并行计算中计算π的值。

Future:任务执行的异步句柄

Future是一个接口,它表示一个异步计算的结果。它可以用于检查任务的状态,获取任务的返回值或取消任务的执行。Future通常用于处理需要长时间执行的任务,例如从网络中下载文件或执行复杂的计算。

RunnableFuture:既可执行任务又可获取结果

RunnableFuture是Runnable和Future的结合体。它既可以像Runnable一样执行任务,也可以像Future一样获取任务的返回值。RunnableFuture通常用于处理需要长时间执行的任务,例如从网络中下载文件或执行复杂的计算。

FutureTask:RunnableFuture的具体实现

FutureTask是RunnableFuture的一个具体实现。它提供了对任务状态的访问,允许取消任务的执行,并提供了对任务返回值的访问。FutureTask通常用于处理需要长时间执行的任务,例如从网络中下载文件或执行复杂的计算。

使用示例

public class Main {

    public static void main(String[] args) {
        // 创建一个Runnable任务
        Runnable runnable = () -> System.out.println("Hello, world!");

        // 创建一个Callable任务
        Callable<String> callable = () -> {
            // 耗时操作
            Thread.sleep(1000);
            return "Hello, world!";
        };

        // 创建一个FutureTask
        FutureTask<String> futureTask = new FutureTask<>(callable);

        // 创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 提交任务到线程池
        executorService.submit(runnable);
        executorService.submit(futureTask);

        // 获取FutureTask的结果
        try {
            String result = futureTask.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // 关闭线程池
        executorService.shutdown();
    }
}

总结

Runnable、Callable、Future、RunnableFuture和FutureTask是Java多线程编程中常用的五个概念。它们之间的区别和联系如下:

  • Runnable是一个函数式接口,用于将任务包装成可执行的对象。
  • Callable与Runnable相似,但它有一个返回值。
  • Future是一个接口,它表示一个异步计算的结果。
  • RunnableFuture是Runnable和Future的结合体。它既可以像Runnable一样执行任务,也可以像Future一样获取任务的返回值。
  • FutureTask是RunnableFuture的一个具体实现。它提供了对任务状态的访问,允许取消任务的执行,并提供了对任务返回值的访问。