[英]How to call Java concurrent threads in web application
我正在某個Web應用程序上工作,我在某些地方感到震驚,我需要您的幫助。 我使用struts framworks開發了一個Java Web應用程序。 此應用程序從用戶那里獲取源文件夾並復制到服務器內部的唯一目錄中,它將在每個源文件夾上執行批處理,並且批處理將在相應文件夾內寫入日志。 上載和復制源文件夾工作正常,但真正面臨的問題是同時執行批處理。 當一個用戶上傳源文件夾並開始執行批處理,而另一個用戶同時上傳源文件夾並開始批處理時,我需要知道第一個用戶批處理何時完成而第二個用戶完成了。如何跟蹤並發線程是否完成。使用Executor 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;
}
}
上面的代碼可以正常工作並在相應的源文件夾中創建日志文件,但是我需要知道批處理何時完成任務,因為一旦批處理完成其任務,該應用程序將觸發帶有日志的電子郵件給用戶。如何知道特定任務是否完成請提供一些示例代碼。
您沒有指定Web應用程序的性質。 如果它不是集群的(運行單個實例),則保留一個靜態變量(或ActionServlet內的一個實例變量,它是singleton )。 當上一個用戶的線程(工人任務)已經在運行時,將該變量設置為“ true”,並在線程完成時將其重置為false。 使用此標志檢查另一個線程(來自另一個用戶)是否可以運行-真意味着不能運行,假意味着可以運行。 或者,將ExecutorService定義為共享(靜態)實例,然后使其成為SingleThreaded池並向其提交工作程序。 希望你有主意。
為了跟蹤並發線程,我使用了java.util.concurrent.Future 。 Future表示異步計算的結果。 提供了一些方法來檢查計算是否完成,等待其完成以及檢索計算結果。 只有在計算完成后才可以使用get方法檢索結果,必要時將其阻塞,直到准備就緒為止。
您可以嘗試這個完整的例子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.