程序在快速运行时解除步骤(Java)

时间:2017-08-15 08:39:02

标签: java jar sleep

我正在运行一个在其操作中多次运行外部Java程序的工具。外部工具以在JFrame中打开JOptionPane开始。

这是我写的一个测试脚本,试图解决我的问题。

import java.io.File;

public class Test {
    public static void main(String[] args) throws Exception {

        for(int i=0; i<6; i++) {
            //Thread.sleep(1000);

            String toRun = "java -jar \"" + "C:\\Folder\\File.jar" + "\" " + i;

            Runtime.getRuntime().exec(toRun, null, new File("C:\\Folder"));
        }
    }
}

当它运行时,只显示最终运行的JOptionPane(i = 5),但似乎其他人“试图”出现,因为窗格似乎正在打开并立即关闭。

但是,当我取消注释Thread.sleep时,所有窗格都会单独打开。如果我将睡眠设置为300(0.3秒),大约一半的窗格出现,通常是第一个和最后一个。

我想找到一种方法来完全运行外部程序的所有实例,而不需要使用Thread.sleep(),如果可能的话。

编辑:根据要求,我也最小化了我的外部程序。

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class File {
    static JFrame frame = new JFrame("Frame");
    private static String doc1Address = "C:\\Folder\\doc1.csv";
    private static String doc2Address = "C:\\Folder\\doc2.csv";


    public static void main(String[] args) throws Exception {
        if(args.length == 1) {

            SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
            Date date = new Date();
            String currentDate = form.format(date);

            //Save Backup of doc1
            String doc1BackAddress = doc1Log.substring(0, doc1Log.length()-15) + "doc1Back " + currentDate + ".csv";
            Path todoc1 = Paths.get(doc1Address);
            Path todoc1Back = Paths.get(doc1BackAddress);
            Files.copy(todoc1, todoc1Back);
            Files.setAttribute(todoc1Back, "dos:readonly", true);

            //Save Backup of doc2
            String doc2BackAddress = doc2Log.substring(0, doc2Log.length()-16) + "doc2Back " + currentDate + ".csv";
            Path todoc2 = Paths.get(doc2Address);
            Path todoc2Back = Paths.get(doc2BackAddress);
            Files.copy(todoc2, todoc2Back);
            Files.setAttribute(todoc2Back, "dos:readonly", true);

            //Format JFrame
            frame.pack();
            frame.setLodoc1ionRelativeTo(null);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

            JOptionPane.showMessageDialog(frame, args[0]);
            frame.dispose();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

找到我自己的问题;由于备份文件使用格式yyyy-MM-dd hh-mm-ss,并且在同一秒内保存的文件导致FileAlreadyExists异常,这意味着只有第一个完成保存的文件允许程序继续运行。

暂停1秒会导致文件具有不同的保存名称,因此不会发生错误。

暂停1秒会导致某些文件名重叠,但也会出现一些不同的名称,因此会出现一些文件。

解决方案:更改名称格式(即包括毫秒),或在if语句中包含备份函数,如果具有相同时间的文件已存在,则忽略该函数。

(同样;感谢@ErwinBolwidt,鼓励我正确地格式化我的问题,我意识到我的代码中的问题不是我认为的那样)。