Vert.x最爽的是标准Verticle中都是单线程,完全不用考虑线程安全问题
import io.vertx.core.*;
public class AsyncExample extends AbstractVerticle {
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new AsyncExample());
}
@Override
public void start() {
Future<String> future1 = fun1();
future1.compose(this::fun2)
.onSuccess(result -> {
System.out.println("1-"+result);
})
.onFailure(e -> {
System.out.println(e.getMessage());
});
Future<String> future2 = fun1();
future2.compose(this::fun2)
.onComplete(ar -> {
if (ar.succeeded()) {
System.out.println("2-"+ar.result());
} else {
System.out.println(ar.cause().getMessage());
}
});
}
private Future<String> fun1() {
return Future.future(promise -> {
vertx.setTimer(100, l -> {
promise.complete("world");
});
});
}
private Future<String> fun2(String name) {
Promise<String> promise = Promise.promise();
vertx.setTimer(200, l -> {
promise.complete("hello " + name);
});
return promise.future();
}
}
import io.vertx.core.AbstractVerticle;
import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ParallelExample extends AbstractVerticle {
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new ParallelExample());
}
@Override
public void start() {
List<Future> futures = IntStream.range(0, 100)
.mapToObj(this::block)
.collect(Collectors.toList());
CompositeFuture.all(futures)
.onSuccess(cf -> cf.list().forEach(System.out::println))
.onFailure(e -> System.out.println(e.getMessage()));
}
private Future<String> block(int i) {
return Future.future(p -> {
vertx.setTimer(100, l -> {
p.complete(i + "-done");
});
});
}
}