Java Phaser实例与Spring-MVC

Java Phaser实例与Spring-MVC,java,multithreading,spring,phaser,Java,Multithreading,Spring,Phaser,我有一个spring@Controller,它有一个请求映射。 当向它发送请求时,它会创建一个延迟结果,并在委托器类上运行一个方法 在控制器中: @ResponseBody @RequestMapping(MenuModelCodes.MENU_NAME) DeferredResult<HttpEntity<?>> getModelCodesWithClass(String target) { final DeferredResult<HttpEntity&

我有一个spring@Controller,它有一个请求映射。 当向它发送请求时,它会创建一个延迟结果,并在委托器类上运行一个方法

在控制器中:

@ResponseBody
@RequestMapping(MenuModelCodes.MENU_NAME)
DeferredResult<HttpEntity<?>> getModelCodesWithClass(String target) {
    final DeferredResult<HttpEntity<?>> deferredResult = getNewDeferredResult();
    delegator.doStuff(target);
    return deferredResult;
}
通过在delegator中调用createThreadDoWork创建的每个子线程在这里向phaser注册自己,完成一些工作,然后到达并取消注册

另一类:

public class AnotherClass {
    @Async
    public void createThreadDoWork(Phaser phaser) throws Throwable {        
        phaser.register();
        //some kind of logic / rest call etc.
        phaser.arriveAndDeregister();
    }
}
当所有子线程完成时,坐在这段代码旁边的委托人:

while (!phaser.isTerminated()) {}
将继续,设置其延迟结果,委托器线程将结束

以下是问题:

我希望每个请求都有一个Phaser,也就是说,每次请求创建一个新的delegator线程时,我都会创建一个新的Phaser

如果我收到5个对我的控制器的请求,它们各自产生一个委托器线程,每个委托器创建一个新的阶段器并将其传递给它们的孩子。 但是,一旦其中一个线程完成其处理并且其特定的Phaser实例被终止,其他委托器线程就会继续并返回,而没有完成它们的任务

移相器可以这样使用吗?我做错什么了吗?我认为这是一种跟踪子线程完成并等待它们完成的有用方法

谢谢

移相器可以这样使用吗

是的,它可以像这样使用,通常会作为一个同步屏障

我做错什么了吗

对。不做

while (!phaser.isTerminated()) {}
繁忙的纺纱会把你累死的。相反,你应该:

phaser.awaitAdvance();
这将迫使你注册一个稍微不同的。在实际开始运行之前,您必须注册一个线程

此外,如果您正在推进相位器,其中有多个相位,则必须使用相位器重新评估

我认为这将是一个有用的方式来跟踪完成儿童 线程并等待它们完成


如果您确实创建了许多未知线程,那么使用移相器将非常有用

谢谢,我删除了delegator中的phaser.register,只需在另一个class.createThreadDoWorkphaser调用之后放置phaser.arriveandWaitAdvance,就可以了。但是打一个电话就可以了。一旦第二个请求到达,并创建一个新的移相器并开始处理,如果原始委托器线程推进移相器,则第二个请求/线程将退出。有什么想法吗?Java7文档似乎也在考虑phaser.register;虽然移相器。同步移相器。到达并等待前进;这是一种可以接受的使用方法吗?这会更好,因为您不忙于旋转。您仍在等待Phaser的完成。我想主要问题是,Phaser的两个实例能否独立运行?i、 e.如果一个相位器的所有各方到达,是否会导致另一个相位的相位增加?或者每个移相器的相位仅针对该移相器的实例?后者。唯一不正确的情况是一个移相器是一个孩子的父母,即:新移相器新移相器
phaser.awaitAdvance();