Java 使用compose创建CompletableFutures的链接列表
我想创建一个完整的未来链 我正试图建立如下的东西 任务1执行某些操作并返回一个字符串作为结果当任务1完成时,我想以任务1的结果作为输入启动任务2。任务2准备好后返回一个整数,以此类推 所以它应该是非常动态的,所以我已经有了这个:Java 使用compose创建CompletableFutures的链接列表,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,我想创建一个完整的未来链 我正试图建立如下的东西 任务1执行某些操作并返回一个字符串作为结果当任务1完成时,我想以任务1的结果作为输入启动任务2。任务2准备好后返回一个整数,以此类推 所以它应该是非常动态的,所以我已经有了这个: try { CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1()); Completab
try {
CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
CompletableFuture<String> result = task1Future.thenCompose(task1Result -> CompletableFuture.supplyAsync(new Task2(task1Result)));
System.out.println(result.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
public class Task1 implements Supplier<String> {
public Task1() {
System.out.println("Task 1 started");
}
@Override
public String get() {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Result Task 1";
}
}
但我现在陷入了困境,因为我不知道如何进行链接,如何使任务更通用,从而可以使用前一个任务的结果启动它
所以我需要有一个方法来构建完整的未来,只需要说start(),一切都会发生
有人能帮我吗?您应该将Task2定义为一个函数,因为它接受以前的字符串结果并生成新的整数结果:
public static class Task2 implements Function<String, Integer> {
public Task2() {
System.out.println("Task 2 started");
}
@Override
public Integer apply(String s) {
return s.length();
}
}
公共静态类Task2实现函数{
公共任务2(){
System.out.println(“任务2已启动”);
}
@凌驾
公共整数应用(字符串s){
返回s.length();
}
}
然后您可以按如下方式链接它们:
CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
.thenApply(new Task1());
CompletableFuture task1Future=CompletableFuture.supplyAsync(newtask1());
CompletableFuture结果=Task1未来。然后应用(新Task2());
System.out.println(result.get());
您应该将Task2定义为一个函数,因为它接受以前的字符串结果并生成新的整数结果:
public static class Task2 implements Function<String, Integer> {
public Task2() {
System.out.println("Task 2 started");
}
@Override
public Integer apply(String s) {
return s.length();
}
}
公共静态类Task2实现函数{
公共任务2(){
System.out.println(“任务2已启动”);
}
@凌驾
公共整数应用(字符串s){
返回s.length();
}
}
然后您可以按如下方式链接它们:
CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
.thenApply(new Task1());
CompletableFuture task1Future=CompletableFuture.supplyAsync(newtask1());
CompletableFuture结果=Task1未来。然后应用(新Task2());
System.out.println(result.get());
如果您希望所有任务都实现功能,您可以按如下方式启动链:
CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
.thenApply(new Task1());
如果您希望所有任务都实现功能,可以按如下方式启动链:
CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
.thenApply(new Task1());
为什么要在
CompletableFuture
已经提供的基础上创建另一个抽象呢?请记住thenApply
仍然在同一个线程中工作。因此,如果B
依赖于A
,那么不要做任何复杂的事情。只需使用然后应用
而不是然后编写
等等,我不理解你的意思,你是说应用更好,因为它是同一个线程,而编写不是?为什么你要在Completable Future
已经提供的基础上创建另一个抽象?请记住然后应用
仍然在同一条线。因此,如果B
依赖于A
,那么不要做任何复杂的事情。只需使用然后应用
而不是然后编写
等等,我不理解你的意思,你的意思是应用更好,因为它是同一个线程,而编写不是?没有真正回答他的问题。他想用compose@ChristianBongiorno不,他想要一个简单的功能链:“当任务1完成时,我想用任务1的结果作为输入启动任务2。”。尝试使用撰写是一个错误。谢谢,这实际上是我正在寻找的。唯一的问题是,第一个仍然需要实现Supplier,因为它不能用SupplySync启动Task2之类的东西,而不是真正回答他的问题。他想用compose@ChristianBongiorno不,他想要一个简单的功能链:“当任务1完成时,我想用任务1的结果作为输入启动任务2。”。尝试使用撰写是一个错误。谢谢,这实际上是我正在寻找的。唯一的问题是,第一个仍然需要实现Supplier,因为它无法使用SupplySync启动类似Task2的东西。