CompletableFuture与FutureTask面试题

1. 你如何使用Java的CompletableFuture来实现异步编程?

答案:Java的CompletableFuture是Java 8引入的一个类,用于实现异步编程。它提供了一种简洁的方式来编写异步代码,使得代码更加易读和易于理解。

以下是如何使用Java的CompletableFuture来实现异步编程的步骤:

  1. 创建一个CompletableFuture对象。这个对象代表了一个可能还没有完成的计算任务。

  2. 使用CompletableFuture的thenApply、thenAccept、thenRun或者thenCompose方法来定义在计算完成后需要执行的操作。这些方法都会返回一个新的CompletableFuture对象,这样你就可以继续在这个新的CompletableFuture对象上添加更多的操作。

  3. 当所有的操作都完成时,你可以使用CompletableFuture的join方法来获取结果。如果计算还没有完成,那么join方法会阻塞,直到计算完成为止。

以下是一个简单的示例,演示了如何使用CompletableFuture来实现异步编程:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureExample {
    public static void main(String[] args) throws Exception {
        // 1. 创建一个CompletableFuture对象
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 2. 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Hello, CompletableFuture!";
        });

        // 3. 定义在计算完成后需要执行的操作
        CompletableFuture<String> resultFuture = future.thenApplyAsync(s -> {
            return s.toUpperCase();
        });

        // 4. 当所有的操作都完成时,获取结果
        System.out.println(resultFuture.get());  // 输出 "HELLO, COMPLETABLEFUTURE!"
    }
}

在这个示例中,我们首先创建了一个CompletableFuture对象,然后在这个对象上添加了一个操作,这个操作将字符串转换为大写。最后,我们使用join方法获取了最终的结果。

2. 你能给我一个例子,说明你如何处理CompletableFuture中的错误和异常?

当然可以。在Java的CompletableFuture中,错误和异常的处理主要通过使用exceptionally、handle和orElse方法来实现。

  1. exceptionally:这个方法会在CompletableFuture完成时执行,无论其正常完成还是异常完成。它接受一个Function类型的参数,这个函数会被应用到CompletableFuture的异常结果上。

  2. handle:这个方法也接受一个Function类型的参数,但是这个函数会被应用到CompletableFuture的结果或者异常上,而不是异常本身。

  3. orElse:这个方法会在CompletableFuture正常完成时执行,如果CompletableFuture抛出异常,那么它会返回一个默认值。

以下是一些示例代码:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) throws Exception {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Hello, CompletableFuture!";
        });

        // 使用exceptionally处理异常
        CompletableFuture<String> futureWithException = future.exceptionally(ex -> {
            System.out.println("Caught exception: " + ex.getMessage());
            return "Default value";
        });

        System.out.println(futureWithException.get());  // 输出 "Default value"

        // 使用handle处理正常结果
        CompletableFuture<String> futureWithResult = future.thenApply(result -> {
            System.out.println("Result: " + result);
            return result.toUpperCase();
        });

        System.out.println(futureWithResult.get());  // 输出 "HELLO, COMPLETABLEFUTURE!"

        // 使用orElse处理异常情况
        CompletableFuture<String> futureWithDefault = future.orElse("Default value");

        System.out.println(futureWithDefault.get());  // 输出 "Default value"
    }
}

在这个示例中,我们首先创建了一个CompletableFuture对象,然后使用了exceptionally、handle和orElse方法来处理正常结果、异常结果和异常情况。

3. 你有没有使用过Java的CompletableFuture进行线程池管理?如果有,你是如何使用的?

是的,我确实在之前的示例代码中展示了如何使用Java的CompletableFuture进行线程池管理。

在创建CompletableFuture对象时,我们可以通过使用submit方法并传入一个Runnable或Callable对象来指定任务的执行者。这个Runnable或Callable对象的run方法就是实际的任务执行逻辑。

同时,我们还可以通过CompletableFuture的Executor接口来指定任务的执行者。Executor接口提供了多种实现,包括ForkJoinPool、FixedThreadPool和SingleThreadExecutor等。

以下是一些示例代码:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class CompletableFutureExample {
    public static void main(String[] args) throws Exception {
        // 使用Executors.newFixedThreadPool创建一个固定大小的线程池
        ExecutorService executor = Executors.newFixedThreadPool(2);

        // 使用submit方法提交任务到线程池
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Hello, CompletableFuture!";
        }, executor);

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Hello, CompletableFuture again!";
        }, executor);

        // 使用thenCombine方法将两个CompletableFuture的结果合并
        CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2);

        // 使用join方法等待任务完成并获取结果
        System.out.println(combinedFuture.join());  // 输出 "Hello, CompletableFuture! Hello, CompletableFuture again!"

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

在这个示例中,我们首先创建了一个固定大小为2的线程池。然后,我们使用submit方法提交了两个任务到线程池,这两个任务分别模拟了长时间的计算任务。最后,我们使用了thenCombine方法将两个任务的结果合并,并使用join方法等待任务完成并获取结果。

4. 你能解释一下Java的CompletableFuture如何与Future接口和ExecutorService接口配合使用吗?

当然可以。Java的CompletableFuture实际上是在Future接口的基础上进行了扩展,它提供了更丰富的方法来处理异步计算的结果。而ExecutorService接口则提供了管理线程池的方法。

在使用CompletableFuture时,我们通常会与ExecutorService接口一起使用。这是因为Java的线程池是一种高级的多线程管理机制,它可以有效地管理和控制线程的创建和销毁,从而提高系统的性能。

以下是一些示例代码:

import java.util.concurrent.*;

public class CompletableFutureExample {
    public static void main(String[] args) throws Exception {
        // 创建一个固定大小的线程池
        ExecutorService executor = Executors.newFixedThreadPool(2);

        // 创建一个CompletableFuture对象
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Hello, CompletableFuture!";
        }, executor);

        // 使用thenApply方法将计算结果转换为字符串
        CompletableFuture<String> transformedFuture = future.thenApply(result -> result.toUpperCase());

        // 使用thenAccept方法处理计算结果
        CompletableFuture<Void> acceptedFuture = transformedFuture.thenAccept(result -> System.out.println("Result: " + result));

        // 使用exceptionally方法处理异常结果
        CompletableFuture<String> exceptionalFuture = transformedFuture.exceptionally(ex -> "Default value");

        // 使用allOf方法等待所有CompletableFuture完成
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(future, acceptedFuture, exceptionalFuture);

        // 使用join方法等待所有CompletableFuture完成并获取结果
        allFutures.join();

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

在这个示例中,我们首先创建了一个固定大小为2的线程池。然后,我们使用CompletableFuture.supplyAsync方法创建了一个CompletableFuture对象,这个对象表示一个异步计算的任务。接着,我们使用了thenApply、thenAccept和exceptionally方法来处理计算结果。最后,我们使用了allOf方法和join方法来等待所有的CompletableFuture完成,并获取了他们的计算结果。

5. 你能详细描述一下你在Java并发编程中使用CompletableFuture的经验吗?

Java并发编程中使用CompletableFuture的一般性建议和最佳实践。

  1. 使用CompletableFuture进行异步编程:在Java中,CompletableFuture是一个非常强大的工具,可以用来进行异步编程。它提供了一种简洁的方式来编写非阻塞的代码,这对于提高程序的性能和响应性非常有用。

  2. 使用CompletableFuture来处理并发任务:如果你的程序需要处理多个并发任务,那么CompletableFuture是一个很好的选择。你可以使用CompletableFuture的静态方法supplyAsync()来创建一个异步任务,然后使用thenApply()、thenAccept()等方法来处理任务的结果。

  3. 使用CompletableFuture来处理异常:在Java中,异常处理是一个复杂的问题。CompletableFuture提供了一种简单的方式来处理异常,你可以通过exceptionally()方法来指定一个函数,这个函数会在CompletableFuture发生异常时被调用。

  4. 使用CompletableFuture的allOf()和anyOf()方法:这两个方法可以帮助你更好地控制并发任务的执行顺序。allOf()方法会等待所有的CompletableFuture都完成,而anyOf()方法只需要有一个CompletableFuture完成就会继续执行。

  5. 使用CompletableFuture的join()和get()方法:join()方法会阻塞当前线程,直到CompletableFuture完成。而get()方法则会返回CompletableFuture的结果,如果CompletableFuture还没有完成,那么它会返回一个未完成的Future。

  6. 注意线程安全问题:虽然CompletableFuture提供了许多方便的工具,但是在使用时也需要注意线程安全问题。特别是当你在多个线程之间共享数据时,需要确保数据的一致性和完整性。

6. 你能解释一下CompletableFuture的工作原理吗?

CompletableFuture是Java 8中引入的一个类,它实现了CompletionStage接口,提供了一组丰富的方法来处理异步操作和多个任务的结果。它支持链式操作,可以方便地处理任务的依赖关系和结果转换。相比于传统的Future接口,CompletableFuture更加灵活和强大。

CompletableFuture的主要工作原理是通过回调的方式来处理计算结果。当你在CompletableFuture上调用thenApply()、thenAccept()等方法时,你实际上是在指定一个函数,这个函数会在CompletableFuture完成时被调用,并且会接收到CompletableFuture的结果作为参数。这种方式可以让你非常方便地处理异步操作的结果。

CompletableFuture还提供了一些其他的方法,比如exceptionally()、whenComplete()等,这些方法可以帮助你更好地控制异步操作的执行过程。

7. 你如何处理CompletableFuture中的错误或异常?

在Java中,你可以使用CompletableFuture的exceptionally()、handle()和whenComplete()等方法来处理错误或异常。下面是一个示例代码,演示了如何使用这些方法:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Hello, CompletableFuture!";
        });

        // 使用exceptionally方法处理异常结果
        CompletableFuture<String> resultFuture = future.exceptionally(ex -> "Error occurred: " + ex.getMessage());

        // 使用handle方法处理计算结果
        CompletableFuture<String> handleResultFuture = future.handle((result, ex) -> {
            if (ex != null) {
                return "Error occurred: " + ex.getMessage();
            } else {
                return result.toUpperCase();
            }
        });

        // 使用whenComplete方法处理计算结果
        CompletableFuture<Void> whenCompleteResultFuture = future.whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("Error occurred: " + ex.getMessage());
            } else {
                System.out.println("Result: " + result);
            }
        });

        // 等待异步操作完成并获取结果
        System.out.println(resultFuture.get());
        System.out.println(handleResultFuture.get());
        System.out.println(whenCompleteResultFuture.get());
    }
}

在这个示例中,我们首先创建了一个异步任务,然后使用了三个不同的方法来处理异步操作的结果。其中,exceptionally()方法会在异步操作发生异常时被调用,handle()方法会在异步操作完成后被调用,并且可以处理计算结果或者抛出异常,whenComplete()方法则在异步操作完成后被调用,并且可以处理计算结果或者返回一个新的CompletableFuture对象。最后,我们使用get()方法等待异步操作完成并获取结果。

8. 你能给我一个你在使用CompletableFuture时遇到的具体问题,以及你是如何解决它的示例吗?

作为一个人工智能,我并没有使用CompletableFuture的实际经验。但是,我可以给你一个示例,演示如何使用CompletableFuture来解决异步编程中常见的问题:

假设你有一个Web应用程序,需要从多个外部API获取数据,并将它们合并到一个单一的数据集中。你可以使用Java的CompletableFuture类来并行地获取这些API的数据,并使用thenCombine()方法将它们合并到一个单一的数据集中。

下面是一个示例代码,演示了如何使用CompletableFuture来完成这个任务:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建多个CompletableFuture对象,每个对象代表一个API请求
        CompletableFuture<String> api1 = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Data from API 1";
        });

        CompletableFuture<String> api2 = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Data from API 2";
        });

        // 使用thenCombine()方法将多个CompletableFuture对象的结果合并到一个单一的数据集中
        CompletableFuture<List<String>> combinedFuture = CompletableFuture.allOf(api1, api2)
                .thenApply(v -> new ArrayList<>(api1.join()).addAll(api2.join()));

        // 等待异步操作完成并获取结果
        List<String> result = combinedFuture.get();

        // 输出结果
        System.out.println(result);
    }
}

在这个示例中,我们首先创建了两个CompletableFuture对象,分别代表两个API请求。然后,我们使用CompletableFuture.allOf()方法将这两个CompletableFuture对象组合成一个新的CompletableFuture对象。最后,我们使用join()方法等待所有CompletableFuture对象完成,并将它们的结果合并到一个单一的数据集中。

9. 你对Java 8的新特性CompletableFuture有什么看法?你认为它的优点和缺点分别是什么?

CompletableFuture是Java 8中引入的一个新的并发编程工具,它为开发者提供了一种简单、高效的方式来处理异步操作和并发任务。结合了Future的优点,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果。

优点:

  • CompletableFuture提供了非常强大的扩展功能,可以帮助我们简化异步编程的复杂性。
  • CompletableFuture提供了函数式编程的能力,可以通过回调的方式处理计算结果。
  • CompletableFuture可以看作是Future的增强版,它提供了更丰富的功能和更方便的使用方式。

缺点:

  • CompletableFuture可能会导致CPU占用率过高,因为它会一直阻塞直到所有任务都完成。
  • CompletableFuture可能会导致内存泄漏,因为它会一直保持对回调函数的引用。

11. 你能描述一下你在项目中如何使用CompletableFuture吗?

作为一个人工智能,我并没有实际的项目经验。但是我可以给你一个使用CompletableFuture的示例:

假设你需要从多个外部API获取数据,并将它们合并到一个单一的数据集中。你可以使用Java的CompletableFuture类来并行地获取这些API的数据,并使用thenCombine()方法将它们合并到一个单一的数据集中。

下面是一个示例代码,演示了如何使用CompletableFuture来完成这个任务:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建多个CompletableFuture对象,每个对象代表一个API请求
        CompletableFuture<String> api1 = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Data from API 1";
        });

        CompletableFuture<String> api2 = CompletableFuture.supplyAsync(() -> {
            // 模拟一个长时间的计算任务
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
            return "Data from API 2";
        });

        // 使用thenCombine()方法将多个CompletableFuture对象的结果合并到一个单一的数据集中
        CompletableFuture<List<String>> combinedFuture = CompletableFuture.allOf(api1, api2)
                .thenApply(v -> new ArrayList<>(api1.join()).addAll(api2.join()));

        // 等待异步操作完成并获取结果
        List<String> result = combinedFuture.get();

        // 输出结果
        System.out.println(result);
    }
}

在这个示例中,我们首先创建了两个CompletableFuture对象,分别代表两个API请求。然后,我们使用CompletableFuture.allOf()方法将这两个CompletableFuture对象组合成一个新的CompletableFuture对象。最后,我们使用join()方法等待所有CompletableFuture对象完成,并将它们的结果合并到一个单一的数据集中。

12. 你能解释一下CompletableFuture和FutureTask的区别吗?

FutureTask和CompletableFuture都是Java中的异步编程工具,但是它们有一些区别。

FutureTask是Java并发包中的一个类,它实现了Runnable接口,可以被线程执行。FutureTask可以用来获取异步计算的结果,但是它需要我们主动阻塞获取。FutureTask的缺点是它不支持回调函数,也就是说我们不能在异步计算完成后自动执行某些操作。

CompletableFuture是Java 8中引入的一个新的并发编程工具,它提供了更加强大的异步编程能力。CompletableFuture支持回调函数,也就是说我们可以在异步计算完成后自动执行某些操作。此外,CompletableFuture还提供了更加丰富的方法来处理异步任务和结果。

总的来说,如果只需要简单地获取异步计算的结果,那么使用FutureTask就可以了;如果需要更加强大的异步编程能力,那么建议使用CompletableFuture。

13. 你能给我一个例子,说明你如何使用FutureTask来处理并发任务?

FutureTask是Java中的一个类,它可以用来处理并发任务。下面是一个例子,演示了如何使用FutureTask来处理并发任务:

import java.util.concurrent.*;

public class FutureTaskExample {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        FutureTask<Integer> futureTask1 = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("Task 1 is running");
                Thread.sleep(1000);
                return 1;
            }
        });
        FutureTask<Integer> futureTask2 = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                System.out.println("Task 2 is running");
                Thread.sleep(2000);
                return 2;
            }
        });
        executor.execute(futureTask1);
        executor.execute(futureTask2);
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("Result: " + futureTask1.get() + ", " + futureTask2.get());
    }
}

在这个示例中,我们创建了一个固定大小的线程池,然后创建了两个FutureTask对象,分别代表两个并发任务。每个FutureTask对象都包装了一个Callable对象,这个Callable对象的call()方法会在一个新的线程中执行。最后,我们将这两个FutureTask对象提交给线程池执行,并等待它们完成。

14. 在你的经验中,CompletableFuture和FutureTask哪个更常用,为什么?

CompletableFuture通常更常用,因为它提供了更强大、更灵活的功能,可以更好地支持异步编程和函数式编程。相比之下,FutureTask虽然也可以用于处理并发任务,但是它的API相对较为底层,使用起来不如CompletableFuture方便。

15. 你如何在一个高并发的环境中使用CompletableFuture或FutureTask?

在一个高并发的环境中,CompletableFuture通常更常用,因为它提供了更强大、更灵活的功能,可以更好地支持异步编程和函数式编程。相比之下,FutureTask虽然也可以用于处理并发任务,但是它的API相对较为底层,使用起来不如CompletableFuture方便。

在使用CompletableFuture或FutureTask时,需要考虑以下几个方面:

  1. 任务的执行方式:如果任务是CPU密集型的,可以使用FutureTask;如果任务是IO密集型的,可以使用CompletableFuture。
  2. 任务的返回值:如果需要对任务的返回值进行处理,可以使用CompletableFuture提供的thenAccept、thenApply、thenCompose等方法;如果只需要获取任务的返回值,可以使用FutureTask提供的get方法。
  3. 线程池的使用:如果需要使用线程池来管理线程,可以使用ExecutorService接口和其实现类(如ThreadPoolExecutor);如果需要使用CompletableFuture提供的线程池功能,可以使用CompletableFuture.supplyAsync()方法。

16. 问题:请解释一下CompletableFuture和FutureTask的主要区别是什么?

参考答案:CompletableFuture是Java 8引入的一种新的异步编程模型,它提供了更加强大的功能,比如组合多个Future的结果,处理异常等。而FutureTask是Java并发包中的一个类,它是RunnableFuture的包装类,主要用于实现多线程的后台任务。

17. 问题:在使用CompletableFuture时,你是如何处理异常的?

参考答案:在CompletableFuture中,我们通常使用exceptionally方法来处理异常。这个方法会在Future完成或者发生异常时被调用,我们可以在这个方法中添加自己的异常处理逻辑。

18. 问题:你能描述一下你如何使用FutureTask来实现一个后台任务吗?

参考答案:首先,我会创建一个实现Runnable接口的任务类,然后创建一个FutureTask对象,将这个任务作为参数传递给FutureTask的构造函数。接着,我会把这个FutureTask对象提交给ExecutorService来进行异步执行。最后,我可以通过调用FutureTask的get方法来获取任务的结果。

19. 问题:在使用CompletableFuture时,你是如何处理并发性的?

参考答案:在CompletableFuture中,我们可以通过调用thenApply、thenAccept、thenRun等方法来创建新的CompletableFuture,这样就可以实现并发执行多个任务。同时,我们还可以使用allOf、anyOf等方法来等待多个CompletableFuture的完成。

20. 问题:你能解释一下什么是“回调”吗?在什么场景下你会使用它?

参考答案:回调是一种编程模式,它允许我们把一个函数作为参数传递给另一个函数,当某个事件发生时,这个函数会被自动调用。在Java中,我们通常会使用回调来实现事件驱动的编程,比如处理用户界面的事件,处理网络请求的结果等。

回调(Callback)是一种常见的编程模式,它允许我们将一个函数作为参数传递给另一个函数,并在需要时调用这个函数。回调通常用于异步编程和事件驱动编程,例如处理用户输入、网络请求等。

在Java中,我们可以使用接口来实现回调。下面是一个简单的示例:

// 定义一个回调接口
interface Callback {
    void onResult(String result);
}

// 定义一个执行任务的函数,它接受一个回调作为参数
public static void doTask(Callback callback) {
    // 模拟一个耗时操作
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    // 执行完成后,调用回调的onResult方法
    callback.onResult("任务完成");
}

// 在主函数中使用回调
public static void main(String[] args) {
    doTask(new Callback() {
        @Override
        public void onResult(String result) {
            System.out.println("回调结果:" + result);
        }
    });
}

在这个示例中,我们定义了一个名为Callback的接口,它有一个名为onResult的方法。然后我们定义了一个名为doTask的函数,它接受一个Callback对象作为参数。在doTask函数中,我们模拟了一个耗时操作,并在完成后调用了回调的onResult方法。最后,在主函数中,我们调用了doTask函数,并传入了一个匿名内部类实现的Callback对象。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值