我尝试用不同的线程执行2种不同的操作。下面是我的代码:
Uni.combine().all()
.unis(getItem(), getItemDetails())
.asTuple().subscribe().with(tuple -> {
context.setItem(tuple.getItem1());
context.setItemDetails(tuple.getItem2());
});
方法:
public Uni<ItemResponse> callGetItem(){
Supplier<ItemResponse> supplier = () -> itemService.getItem("item_id_1");
return Uni.createFrom().item(supplier);
}
public Uni<ItemDetailsResponse> callGetItemDetail(){
Supplier<ItemDetailsResponse> supplier = () -> itemService.getItemDetail("dummy_item_id");
return Uni.createFrom().item(supplier) ;
}
但是当我运行代码都callGetItem()和callGetItemDetail ()方法在同一个线程(executor-thread-0)中工作。
我哪里做错了?
编辑:
当我给执行器服务Executors.newFixedThreadPool(2)为我的单元,它们仍然在单线程中工作。我将callGetItem()和callGetItemDetail()修改为:
public Uni<ItemResponse> callGetItem(){
Supplier<ItemResponse> supplier = () -> itemService.getItem("item_id_1");
return Uni.createFrom().item(supplier).emitOn(executor);
}
public Uni<ItemDetailsResponse> callGetItemDetail(){
Supplier<ItemDetailsResponse> supplier = () -> itemService.getItemDetail("dummy_item_id");
return Uni.createFrom().item(supplier).emitOn(executor) ;
}
executor is:
ExecutorService executor = Executors.newFixedThreadPool(2);
,但它们仍然在同一个线程中工作。你知道为什么会这样吗?
由于您使用Uni.combine().all().unis().asTuple()
组合不同的Uni
,因此组合后的Uni
将在最后一个元素发出其项后发出其结果(组合)
最后一个(上游)Uni
将有它的项目发射(就像其他Uni
s的情况一样)在任何Thread
上,你已经声明性地设置它发射。因此,Uni
的组合将在同一个调用Thread
的情况下执行。
因此,如果您正在访问组合的组值,则将在相同的执行载体Thread
上访问这些值。