public class Test {
public static void main(String[] args) {
ExecutorService executorService= Executors.newSingleThreadExecutor();
System.out.println("A tells B to do something");
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
try {
System.out.println("B is doing something");
Thread.sleep(5000);
return "B has done something";
} catch (InterruptedException e) {
return "B died";
}
},executorService);
executorService.shutdown();
future.thenAccept(System.out::println);
System.out.println("A continues to do other thing");
}
}
public class CompletableFuture {
private final Object object = new Object();
private String result;
private Supplier supplier;
private ExecutorService executorService = Executors.newSingleThreadExecutor();
private boolean isComplete;
private CompletableFuture() {
}
public void setSupplier(Supplier supplier) {
this.supplier = supplier;
}
public void thenAccept(Consumer consumer) {
executorService.submit(() -> {
synchronized (object) {
try {
while (!isComplete) {
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
consumer.accept(result);
});
executorService.shutdown();
}
public void process() {
result = supplier.get();
synchronized (object) {
isComplete = true;
object.notify();
}
}
public static CompletableFuture supplyAsync(Supplier supplier, ExecutorService executorService) {
CompletableFuture future = new CompletableFuture();
future.setSupplier(supplier);
executorService.submit(future::process);
return future;
}
}
public interface Consumer {
void accept(String s);
}
public interface Supplier {
String get();
}