gpt4 book ai didi

java - 如何链接多个方法,其中每个方法主线程已通过而内部线程仍在工作?

转载 作者:行者123 更新时间:2023-12-02 03:33:20 25 4
gpt4 key购买 nike

我有这样的代码。每个方法都是一个单独暴露给剩余调用的阶段:

void methodA(@FormDataParam ("fd") fd){
//Executor spawns thread - takes around 15-30 min as per data
//main thread exits with "Process begun" message while thread spawned still running
}

void methodB(){
//Executor spawns thread - takes around 60-600 min as per data
//main thread exits with "Process begun" message while thread spawned still running
}

void methodC(){
//Executor spawns thread - takes around 10-60 min as per data
//main thread exits with "Process begun" message while thread spawned still running
}

这些阶段之前是按顺序执行的。现在,额外的要求是如果需要的话一次性执行它们。为此,必须将一个 api 作为其余 api 公开,例如:

void methodAll(@FormDataParam ("fd") fd){
methodA(fd);
methodB();
methodC();
}

问题是 methodA()、methodB()、methodC() 主线程立即返回,而它们生成的线程仍在运行,因此导致其他后续方法在前一个方法完成之前开始执行。

我正在修复中,如何在不对现有三个 api 进行实质性更改的情况下解决这个问题?

最佳答案

现在你有(伪代码):

class RestController {

void methodA() {
new Thread() {
// some hard work
}.start();
}

void methodB() {
new Thread() {
// some hard work
}.start();
}

}

重构后:

class RestController {

void methodA() {
new Thread() {
service.methodA();
}.start();
}

void methodB() {
new Thread() {
service.methodB();
}.start();
}

void methodD() {
new Thread() {
service.methodA();
service.methodB();
}.start();
}

}

class Service {

void methodA() {
// some hard work
}

void methodB() {
// some hard work
}

}

当然你可以使用ExecutorService或任何其他用于线程化的帮助程序,而不是手动生成线程。

如果您的 Controller 在生成线程之前/之后进行验证、预处理和后处理,正如您所说,并且它确实是相同的代码,那么您可以将其提取到采用 Runnable 的方法中并在之间执行它预处理和后处理以避免重复。

  void execute(Runnable runnable) {
// do validation
// do preProcess
new Thread(runnable).start();
// do postProcess
}
...
void methodA() {
execute(new Runnable() {
@Override
void run() {
service.methodA();
}
});
}

或者您可以在服务方法中进行此验证。

关于java - 如何链接多个方法,其中每个方法主线程已通过而内部线程仍在工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37767717/

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