最近,我正在从事一个项目,其中我有2个同时进行2个异步调用。由于我与Quarkus合作,我最终尝试利用叛变和垂直。x库。然而,我无法让我的代码与Unis一起工作。在下面的代码中,我可以想象两个Uni都将被调用,返回速度最快的Uni将被返回。然而,当组合uni时,似乎只返回列表中的第一个uni,即使第一个uni需要更长的时间。
由于uniFast应该首先完成,所以下面的代码应该在打印时打印出来。如何组合Unis并让更快的Unis先返回?
@Test
public void testUniJion(){
var uniSLow = Uni.createFrom().item(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "one";
});
var uniFast = Uni.createFrom().item(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "two";
});
var resp = Uni.join().first(uniSLow,uniFast).withItem().await().indefinitely();
System.out.println(resp);
var resp2 = Uni.combine().any().of(uniSLow,uniFast).await().indefinitely();
System.out.println(resp2);
}
注意:这不是我试图实现的实际代码。在我的代码中,我试图从两个不同的数据库中提取数据。然而,一个数据库通常比另一个数据库有更多的延迟。然而,Uni似乎总是在等待较慢的数据库。我只是想更好地理解叛变和Uni,所以我做了这个代码示例。
问题是您没有告诉Mutiny应该在哪个线程上运行每个uni。如果我添加一个系统。根据您的示例:
// Slow and Fast for the different Uni
System.out.println( "Slow - " + Thread.currentThread().getId() + ":" + Thread.currentThread().getName() );
我得到以下输出:
Slow - 1:Test worker
one
Slow - 1:Test worker
Fast - 1:Test worker
one
输出显示所有内容都在同一个线程上运行,因此当我们阻塞第一个线程时,第二个线程也会被阻塞。这就是为什么输出是一个一个。
并行运行uni的一种方法是在订阅时使用不同的执行器:
ExecutorService executorService = Executors.newFixedThreadPool( 5 );
uniSlow = uniSlow.runSubscriptionOn( executorService );
uniFast = uniFast.runSubscriptionOn( executorService );
现在,当我运行测试时,我得到了预期的输出:
Slow - 16:pool-3-thread-1
Fast - 17:pool-3-thread-2
two
Slow - 18:pool-3-thread-3
Fast - 19:pool-3-thread-4
two
请注意,这次Slow和Fast在不同的线程上运行。
穆特尼指南有一节关于emitOn与runSubscriptionOn之间的区别,以及一些关于如何更改发射线程的示例。
问题内容: 在我的React应用程序中,我有一个参数数组(例如一些ID),这些参数应该用作ajax调用队列的参数。问题是该数组可能包含1000多个项目,如果我仅使用forEach循环递归地进行ajax调用,则浏览器页面最终会在每个请求得到解决之前停止响应。 是否有一种技术/库可以允许以异步方式一次发送5个请求,例如,一次异步发送ajax请求,并且仅在这些请求完成后才继续下一个5? 后续问题: 反应
问题内容: 在这里,我需要同时执行,并在同一时间。 当我尝试在其上放置一个并行块时,由于在官方站点中这样提到,因此它引发了错误。 } 问题答案: 您不必将每个调用都放在阶段内的并行作业中,因此可以这样进行:
问题内容: sleep()是Thread类的静态方法。从多个线程调用时,它是如何工作的。以及如何找出当前的执行线程。? 或者可能是更通用的问题?如何从不同线程调用静态方法?不会有并发问题吗? 问题答案: 如何找出当前的执行线程? 不必。它仅调用操作系统,该操作系统始终使调用它的线程休眠。
问题内容: 我有这个功能,当我点击标签时,我想调用两个功能,一个来自父组件的props的处理程序功能,还有这个功能 如何调用这两个函数?这是父组件的处理函数 问题答案: 这样写: 或创建一个函数,将其用作单击处理程序。在该函数内部调用其他两个函数,如下所示: 请参阅使用箭头功能的两种方法: 1-简洁的机身: 2块体 在内部的程序块主体(函数的主体)中,我们可以执行任意数量的任务。 像这样:
我有多个线程,它们都从一个对象运行。我希望“主线程”单独运行,直到某一点,然后它等待,所有其他线程一起运行,然后主线程唤醒,等等。。。。。我无法同步线程。我要么得到一个非法的监视器状态异常,要么它卡在一个“等待”循环中,该循环应该接收一个永远不会到达的“通知”。 更具体地说,我有一个带有数组的对象。阵列中的每个单元都有一个线程,该线程检查相邻单元,然后使用该信息更改其单元。为了有序地进行更改,我希
问题内容: 我有两个项目,其中一个(服务)包括第二个(核心)。我已经在以下Core项目中定义了此PropertyPlaceholderConfigurer: 我想在上层项目中扩展Core占位符,包括appConfig.properties和其他一些。我发现的唯一方法是在上层定义另一个不同的bean(不同的ID),并包括新的bean: 但是它产生的结果是找不到appConfig.properties