MST

星途 面试题库

面试题:Java中CompletableFuture使用自定义线程池的supplyAsync方法基础

在Java中,使用CompletableFuture的supplyAsync方法并结合自定义线程池来异步执行一个返回字符串的任务,假设自定义线程池已创建为ExecutorService executor,写出代码示例,并解释supplyAsync方法的参数含义。
20.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class CompletableFutureExample {
    private static final AtomicInteger taskCounter = new AtomicInteger(1);

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            String taskName = "Task-" + taskCounter.getAndIncrement();
            System.out.println(taskName + " is running on thread: " + Thread.currentThread().getName());
            // 模拟任务执行
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Result from " + taskName;
        }, executor);

        future.thenAccept(System.out::println)
              .exceptionally(ex -> {
                    System.err.println("An error occurred: " + ex.getMessage());
                    return null;
                });

        executor.shutdown();
    }
}

supplyAsync方法参数含义

  1. 第一个参数
    • 是一个实现了Supplier接口的 lambda 表达式或方法引用。Supplier接口只有一个get方法,它不接受参数,返回一个结果。在这里,() -> {... }表示一个Supplier,它定义了异步执行的具体任务逻辑,在上述代码中,该任务模拟了一段时间的执行,并返回一个字符串结果。
  2. 第二个参数
    • 是一个Executor对象,这里使用的executor是自定义的线程池。CompletableFuture会使用这个线程池中的线程来异步执行第一个参数所定义的任务。这样可以复用线程,提高性能,并且可以对线程进行统一管理,例如控制线程数量等。