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



我有这样的代码。每个方法都是独立公开给 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();
      }
    });
  }

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

最新更新