2017-02-16 43 views
0

单线程我在Spring MVC的一个应用。在控制器中,用户可以运行进程(有按钮)。进程工作一个小时(将其命名为“longProces”)。 所以我想在其他线程中运行这个方法“longProces”。只运行在方法

当“longProces”正在运行时,其他用户(当他想运行“longProces”时)应该得到消息:“此进程正在运行”并且他的线程被终止(不等待它转向)。

我能做些什么呢?任何想法?

谢谢解答

+0

,如果你提供一些代码示例。但一般来说,你可以有某种标志,这将是很高兴,开启时,过程开始运行上,当工艺要求的过程中开始你将检查该标志。另外,现在才结束关闭我建议把标志测试和synchronized块启动过程中避免竞争条件 – urag

回答

0

可以使用的ExecutorService而不是执行者。

在执行器服务中提交任务并维护将来的引用在某些列表或映射中说。 ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); Future future = threadExecutor.submit(new Task()); //submit the future in collection

你可以检查已提交的任务每一个新的请求,但如果状态completed-

//retrieve future instance from collection 
if(future.isDone()){ 
     //accept new request 
} 
else "process already running" 
+0

谢谢你回复@Priya Singh。但是我应该在哪里定义一个ExecuteService和Future?现在,当我定义Future类时,第二个线程等待他的时间,然后在第一个线程完成自己的工作时执行“longProces”。我想在第一次运行时“杀死”第二个线程 – damians

+0

您可以为ExecutorService I.e创建一个单例bean。 TaskExecutor接口。您无需定义其由JDK提供的未来类。如果你有特定的要求,只有一个任务应该运行,那么你可以保留Future的实例变量引用,或者如果你想针对一个用户存储一个任务,那么你可以使用map来存储它。我希望我能够正确解释它。 –

+0

是的,我明白你的意思:) – damians

0

这是一个基于设计的问题。

对于这种情况,我直截了当的解决方案是 - 在数据库或任何其他持久层中保持这种较长的进程状态,以便您可以为每个请求首先执行逻辑检查是否存在任何长进程处于活动状态或不在持久状态。基于这种情况,你可以决定你的流量。

更重要的一点是,持久层方法是用一个公共共享进程处理多个用户请求的正确解决方案。

0

下面是我的狙击代码:

@RequestMapping("/generate") 
public String generate(HttpServletResponse response, Model model) throws Exception { 
    String communique; = "The process is launching"; 

    Runnable runnable =() -> { 
     try { 
      generatorService.runLongProces(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }; 

    Executor tasExecutor = Executors.newSingleThreadExecutor(); 

    try{ 
    tasExecutor.execute(runnable); 

    } catch (Exception ex) 
    { 
    communique = "The process is failed"; 
    } 

    response.setStatus(HttpServletResponse.SC_ACCEPTED); 

    model.addAttribute("communique", communique); 

    return "institutions/download"; 
} 

,我想我在构造函数中设置一个线程。

也许我应该为Spring TaskExecutor创建一个单例bean?