我有这样的代码。每个方法都是独立公开给 rest 调用的阶段:
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();
}
问题是方法A(),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 或任何其他帮助程序进行线程化,而不是手动线程生成。
如果你的控制器在生成线程之前/之后进行验证、预处理和后处理,正如你所说,它实际上是相同的代码,那么你可以将其提取到方法中,该方法需要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();
}
});
}
或者,您可以在服务方法中执行此验证。