108、实现一个静态方法 CompletableFuture<T> <T> supplyAsync(Supplier<T> action, Executor exec) ,该方法返回 CompletableFuture<T> 的一个子类实例,其 cancel 方法可以在任务正在运行时中断执行 action 方法的线程。在一个 Runnable 中,捕获当前线程,然后调用 action.get() ,并使用结果或异常完成 CompletableFuture 。
以下是实现该方法的 Java 代码示例:
import java.util.concurrent.*;
public class CustomCompletableFuture {
public static <T> CompletableFuture<T> supplyAsync(Supplier<T> action, Executor exec) {
CompletableFuture<T> future = new CompletableFuture<T>() {
private Thread runningThread;
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
if (runningThread != null && mayInterruptIfRunning) {
runningThread.interrupt();
}
return super.cancel(mayInterruptIfRunning);
}
@Override
public T get() throws InterruptedException, ExecutionException {
return super.get();
}
};
exec.execute(() -> {
Thread currentThread = Thread.currentThread();
((CustomCompletableFuture<T>) future).runningThread = currentThread;
try {
T result = action.get();
future.complete(result);
} catch (Exception e) {
future.completeExceptionally(e);
}
});
return future;
}
}
上述代码定义了一个 CustomCompletableFuture 类,其中的 supplyAsync 方法实现了所需功能。在 Runnable 中捕获当前线程,调用 action.get() 并使用结果或异常完成 CompletableFuture 。同时重写了 cancel 方法,使其能在任务运行时中断线程。
109、静态方法 CompletableFuture.allOf(CompletableFuture<?>... cfs) 不会返回参数的结果,使用起来有点麻烦。请实现一个方法,用于合并相同类型的可完成未来(CompletableFuture): static <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> cfs) 。注意,该方法使用列表作为参数,因为泛型类型不能使用可变参数。
以下是实现该方法的 Java 代码示例:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class CompletableFutureUtils {
public static <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> cfs) {
CompletableFuture<Void> allFutures = CompletableFuture.allOf(cfs.toArray(new CompletableFuture[0]));
return allFutures.

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



