我希望程序在模型中循环 17 次,但是如果我循环超过 5 次,程序就会卡住,我尝试查找问题,这是因为 edt 无法执行繁重的任务,但我尝试创建代码中的新线程来解决它,但我似乎没有正确地弄清楚。
P.S:程序可以运行,所以这不是实际程序的问题,而是循环的问题(循环了 17 次)。
public synchronized void start(int max) {
try {
// max = total number of questions
for (int i = 1; i < max; i++) {
//new cmd command
Process p = Runtime.getRuntime().exec("cmd");
// new thread
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null)
System.out.println(line);
}
catch (Exception e) {
e.printStackTrace();
}
}).start();
//used to change text in files and the remaining cmd commands and move the result
try (PrintStream out = new PrintStream(p.getOutputStream())) {
//to clear previous index folder and delete results folder
deleteFile();
//to rewrite the "collection.spec" folder with the address of the Answers file
answerFile(i);
//to rewrite the "trec.topics.list"" folder with the address of the Questions file
questionFile(i);
/* PROBLEM STARTS HERE! */
for(int c = 1; c <= 17; c++) {
// after rename do the remaining cmd commands
out.println("C:/TERRIERS/terrier/bin/trec_terrier.bat -i");
out.println("C:/TERRIERS/terrier/bin/trec_terrier.bat -r");
//change model
modelSelect();
}
/* PROBLEM ENDS HERE!*/
// .....
}
p.waitFor();
//move the ".res" folder to the Results folder in projects directory
takeFile(i);
}
}
catch(IOException ex) {
}
catch(InterruptedException ex) {
}
}
这是modelSelect函数
int counter = 1;
public void modelSelect() {
//location of file
String s = "C:\\TERRIERS\\terrier\\etc\\trec.models";
try {
FileOutputStream is = new FileOutputStream(s);
OutputStreamWriter osw = new OutputStreamWriter(is);
Writer w = new BufferedWriter(osw);
//depends on count value change the model inside "trec.models" and increase counter by 1
switch (counter) {
case 1 : w.write("uk.ac.gla.terrier.matching.models.BM25"); counter++; break;
case 2 : w.write("uk.ac.gla.terrier.matching.models.DFR_BM25"); counter++; break;
case 3 : w.write("uk.ac.gla.terrier.matching.models.TF_IDF"); counter++; break;
case 4 : w.write("uk.ac.gla.terrier.matching.models.BB2"); counter++; break;
case 5 : w.write("uk.ac.gla.terrier.matching.models.IFB2"); counter++; break;
case 6 : w.write("uk.ac.gla.terrier.matching.models.In_expB2"); counter++; break;
case 7 : w.write("uk.ac.gla.terrier.matching.models.In_expC2"); counter++; break;
case 8 : w.write("uk.ac.gla.terrier.matching.models.InL2"); counter++; break;
case 9 : w.write("uk.ac.gla.terrier.matching.models.PL2"); counter++; break;
case 10 : w.write("uk.ac.gla.terrier.matching.models.DFR"); counter++; break;
case 11 : w.write("uk.ac.gla.terrier.matching.models.DFRWeightingModel"); counter++; break;
case 12 : w.write("uk.ac.gla.terrier.matching.models.DLH"); counter++; break;
case 13 : w.write("uk.ac.gla.terrier.matching.models.DLH13"); counter++; break;
case 14 : w.write("uk.ac.gla.terrier.matching.models.Hiemstra_LM"); counter++; break;
case 15 : w.write("uk.ac.gla.terrier.matching.models.Idf"); counter++; break;
case 16 : w.write("uk.ac.gla.terrier.matching.models.LemurTF_IDF"); counter++; break;
case 17 : w.write("uk.ac.gla.terrier.matching.models.WeightingModel"); counter=1; break;//reset counter to 1
}
w.close();
}
catch (IOException e) {
}
}
最佳答案
我认为您的问题是缺少同步。
启动两个批处理文件 (out.println("C:/TERRIERS/terrier/bin/trec_terrier.bat -i"); out.println("C:/TERRIERS/terrier/bin/trec_terrier. bat -r");
),无需等待这些命令完成,您就可以调用 modelSelect()
并启动接下来的两个批处理文件。
整个过程的 Java 端速度非常快 - 比批处理文件快得多。
最好的解决方案是等待批处理文件完成。如果这不能完成,那么至少将您的代码更改为
out.println("C:/TERRIERS/terrier/bin/trec_terrier.bat -i");
out.println("C:/TERRIERS/terrier/bin/trec_terrier.bat -r");
Thread.sleep(100);
//change model
modelSelect();
关于Java for循环线程锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35102503/