Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在方法中只运行一个线程_Java_Multithreading - Fatal编程技术网

Java 在方法中只运行一个线程

Java 在方法中只运行一个线程,java,multithreading,Java,Multithreading,我在SpringMVC中有一个应用程序。在控制器中,用户可以运行进程(有按钮)。流程工作一小时(将其命名为“longProces”)。 所以我想在其他线程中运行这个方法“longProces” 当“longProces”正在运行时,其他用户(当他想要运行“longProces”时)应该会收到消息:“此进程正在运行”,并且他的线程被终止(不等待轮到它) 我能做什么?有什么想法吗 感谢您的回答这是一个基于设计的问题 对于这个场景,我的直截了当的解决方案是——在数据库或任何其他持久性层中维护这个长流程

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

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

我能做什么?有什么想法吗


感谢您的回答

这是一个基于设计的问题

对于这个场景,我的直截了当的解决方案是——在数据库或任何其他持久性层中维护这个长流程状态,这样您就可以为每个请求实现逻辑,首先检查持久性中是否有任何长流程处于活动状态。根据这个条件,你可以决定你的流量


另一个关键点是,持久层方法将是使用一个公共共享进程处理多用户请求的正确解决方案。

下面是我的sniped代码:

@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

您可以使用ExecutorService而不是Executor

在executor服务中提交任务,并在某些列表或地图中维护将来的引用。
ExecutorService threadExecutor=Executors.newSingleThreadExecutor();
Future=threadExecutor.submit(新任务());
//提交收藏中的未来

在每个新请求中,您可以检查已提交的任务,如果已完成,则检查状态-

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

如果您提供一些代码示例就好了。但一般来说,您可以在流程开始运行时启用某种标志,在流程现在结束时禁用该标志,然后在调用流程开始之前检查该标志。此外,我建议将标志测试和流程开始放在同步块中,以避免谢谢你的回答。但我应该在哪里定义ExecuteService和未来?现在,当我定义Future类时,第二个线程等待时间,然后在第一个线程完成自己的工作时执行“longProces”。我希望在第一个线程运行时“杀死”第二个线程,您可以为ExecutorService创建一个单例bean,即TaskExecutor。您不需要定义JDK提供的未来类。若您有只运行一个任务的特定要求,那个么您可以保留实例变量引用以备将来使用,或者若您想针对一个用户存储一个任务,那个么您可以使用map来存储它。我希望我能正确地解释它。是的,我理解你的意思:)