如何在Web应用程序中调用Java并发线程

时间:2015-12-01 11:33:41

标签: java multithreading threadpool execution java.util.concurrent

正在处理一些网络应用程序,我在某些地方受到了打击,我需要你的帮助。 我使用struts framworks开发了一个java Web应用程序。此应用程序从用户获取源文件夹并复制到服务器内的唯一目录中,它将在每个源文件夹上执行批处理,批处理将在各个文件夹内写入日志。 上传和复制源文件夹工作正常但实际问题是并发执行批处理。 当一个用户上传源文件夹并开始批处理执行时,另一个用户也同时上传源文件夹并开始批处理,我需要知道第一个用户批处理何时完成,第二个用户完成。如何跟踪并发线程是否已完成。使用Executor执行程序= Executors.newCachedThreadPool();请在下面找到代码

 private class BackgroundTask extends SwingWorker<Integer, String> {
        String srcpath;
 String log;
         BackgroundTask(String path)
         {
             this.srcpath=path;
         }
            private int status;

            public BackgroundTask() {

            }
            @Override
            protected Integer doInBackground() {
                try {
                    final File batchFile = new File("D://chetan//bin//runner.bat");
                 ProcessBuilder builder = new ProcessBuilder();
                  builder.directory(new File(srcpath));
                  String[] cmd = { "cmd", "/c",batchFile.getAbsolutePath(),"-X"};

                  for (int x = 0; x < cmd.length; x++) {
                        System.out.println("Command :" + cmd[x]);   

                    }
                     builder.command(cmd);

                     Process process;
                     process = builder.start();
                     InputStream is1 = process.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is1);
                        BufferedReader br = new BufferedReader(isr);
                        String line;
                     File logfile;
                     File logpath=new File(srcpath+File.separator+"LOG");
                     if(logpath.isDirectory())
                     {
                          logfile=new File(logpath+File.separator+"runner.log");

                     }
                     else
                     {
                         logpath.mkdir();
                         logfile=new File(logpath+File.separator+"runner.log");
                     }
                     logfile.createNewFile();
                     while ((line = br.readLine()) != null) {                           
                            //appendText(line);                     
                         log+=line+"\n";                    
                     }
                     FileUtils.writeStringToFile(logfile,log);           

                    process.getInputStream().close();
                    process.getOutputStream().close();
                    process.getErrorStream().close();
                    process.destroy();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return status;
            }
            @Override
            protected void process(java.util.List<String> messages) {
               // statusLabel.setText((this.getState()).toString());               
            }

            @Override
            protected void done() {

            }

        }

第二课

public class RunnerAnalysisAction extends ActionSupport implements SessionAware {
 private BackgroundTask backgroundTask;

 public String execute() {
  String projectRoot="D:\\Sample_DemoProjects\\DEMO_375530\\";
 backgroundTask = new BackgroundTask(projectRoot+ProjectName);
 Executor executor= Executors.newCachedThreadPool();
 executor.execute(backgroundTask);
return SUCCESS;  
 }
}

上面的代码工作正常,并在相应的源文件夹中创建日志文件,但我需要 知道批处理何时完成任务,因为一旦批处理完成其任务,该应用程序将触发电子邮件  用户使用log.How知道特定任务是否完成。请提供一些示例代码。谢谢。

2 个答案:

答案 0 :(得分:0)

您没有指定Web应用程序的性质。如果它没有聚集(运行单个实例),则保留一个静态变量(或 ActionServlet 中的实例变量, singleton )。当前一个用户的线程(工作人员任务)已经运行时,将此变量设置为“true”,并在线程完成时将其重置为false。使用此标志来检查另一个线程(来自另一个用户)是否可以运行 - true表示无法运行,false表示可以运行。或者将ExecutorService定义为共享(静态)实例,然后将其设置为 SingleThreaded 池并向其提交工作者。希望你明白了。

答案 1 :(得分:0)

跟踪我使用java.util.concurrent.Future的并发线程。 Future表示异步计算的结果。提供方法以检查计算是否完成,等待其完成,以及检索计算结果。只有在计算完成时才能使用方法get检索结果,必要时阻塞直到准备就绪。

您可以尝试完整example