gpt4 book ai didi

java - 在同一个对象上使用 Fork 和 Join

转载 作者:行者123 更新时间:2023-11-29 08:29:07 25 4
gpt4 key购买 nike

我正在做一个 spring boot 项目。我有一个场景,我需要进行服务调用、从数据库中获取数据并更新响应对象。我想在两个不同的线程中执行这些操作以获得更好的性能。

我尝试使用下面的代码

Thread t1 = new Thread(new Runnable(){

public void run(){
try {
//make service call and update response object.
}
catch(Exception e){

}
}
});

t1.start();
//fetch data from DB and update the response object.

t1.join();

但是当我尝试点击请求并让它完成而不放置任何断点(基本上按照我想要的顺序执行它)时,这不起作用。

是否有更好的替代方案来实现这一目标?

我可以在这里使用 fork 和 join 吗?如果是,我该如何使用它?

请注意,来自服务调用的数据和来自数据库的数据不相互依赖。

在进一步挖掘中,我在 oracle 文档中发现了以下信息

http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

First and foremost, fork/join tasks should operate as “pure” in-memory algorithms in which no I/O operations come into play. Also, communication between tasks through shared state should be avoided as much as possible, because that implies that locking might have to be performed. Ideally, tasks communicate only when one task forks another or when one task joins another.

最佳答案

我认为您不需要为此使用 ForkJoinPool。您可以简单地使用 CountDownLatch。主/父线程将等待,直到 倒计时0

CountDownLatch latch = new CountDownLatch(2);
Thread t1 = new Thread(() -> {
// do service call and update the response object
latch.countDown();
});
Thread t2 = new Thread(() -> {
// do database call and update the response object
latch.countDown();
});

t1.start();
t2.start();

latch.await(); // main thread will wait here for the completion of T1 & T2 thread.

编辑:

因此首先以不同的方式处理线程中的异常,如下所示,它像我们一样简单地处理异常。

Thread t1 = new Thread(() -> {
// do service call
try {
// your code here
} catch (Exception e) {

}
latch.countDown();
});

另一种方法是像下面这样使用新的 Thread.UncaughtExceptionHandler()

Thread.UncaughtExceptionHandler exceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
//your exception handling code should come here
}
};

t1.setUncaughtExceptionHandler(exceptionHandler);

有关 Thread 中异常处理的更多信息,您可以查看 this

关于java - 在同一个对象上使用 Fork 和 Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49758061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com