Java for循环线程锁

标签 java multithreading for-loop locking

我希望程序在模型中循环 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/

相关文章:

java - 为什么JAVA WindowsLookAndFeel UI在Win7和Win2003中看起来不同?

java - 如何在不创建新的mongodb连接的情况下插入文档?

java - For-Each 循环 Java 错误 ArrayIndexOutOfBoundsException

c++ - 有没有一个 C++ 版本在循环结束后保留​​在范围内的 for 循环初始化中声明的变量?

java - java中什么是资源?为什么用完了就要关闭?

java - 关于 java 库文档的担忧

java - 为什么 VisualVM 在 Linux 上不显示守护线程?

c - 当两个线程同时休眠时,什么会产生这种奇怪的行为?

javascript - 如何在循环javascript中显示倒计时?

java - 无法通过 JDBC 禁用 Oracle 外键