Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM在无故使用连续线程时关闭_Java_Multithreading_File_Timer_Directory - Fatal编程技术网

Java JVM在无故使用连续线程时关闭

Java JVM在无故使用连续线程时关闭,java,multithreading,file,timer,directory,Java,Multithreading,File,Timer,Directory,我的程序遇到问题。 我正在尝试按结尾对下载的文件进行排序。到目前为止,我已经得到了观察给定文件路径并在HashSet中列出这些文件的结构。 我现在的问题是,程序会持续运行几秒钟,但最后以退出代码0结束,所以一切都应该正常 public class WatchDir { protected HashSet<File> hashSetOfFiles; protected String filePath = ""; public WatchDir() {

我的程序遇到问题。 我正在尝试按结尾对下载的文件进行排序。到目前为止,我已经得到了观察给定文件路径并在
HashSet
中列出这些文件的结构。 我现在的问题是,程序会持续运行几秒钟,但最后以退出代码0结束,所以一切都应该正常

public class WatchDir {

    protected HashSet<File> hashSetOfFiles;
    protected String filePath = "";

    public WatchDir() {

        chooseFilePath();
        if (filePath.isEmpty())
            return;

        listAnfangFiles();

        new Thread() {
            public void run() {
                listNewFiles();
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }

    private void listNewFiles() {

        File file = new File(filePath);

        for (File f : file.listFiles()) {
            if (hashSetOfFiles.add(f)) {
                newFileFound(f);
            }
        }
    }

    private void newFileFound(File f) {

        // Hier kommen alle neuen Dateien an
        System.out.println(f.getName());
    }

    private void listAnfangFiles() {

        hashSetOfFiles = new HashSet<File>();
        File f = new File(filePath);

        for (File ff : f.listFiles()) {
            hashSetOfFiles.add(ff);
        }
    }

    private void chooseFilePath() {
        //
        // JFileChooser chooser = new JFileChooser();
        // chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        //
        // if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
        // filePath = chooser.getSelectedFile().getAbsolutePath();

        filePath = "C:\\Users\\maurice\\Desktop\\Test";
    }

    public static void main(String[] args) {
        new WatchDir();
    }
}
公共类WatchDir{
受保护的HashSet-hashsetofiles;
受保护的字符串filePath=“”;
公众监察主任(){
选择文件路径();
if(filePath.isEmpty())
返回;
listAnfangFiles();
新线程(){
公开募捐{
listNewFiles();
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
};
}.start();
}
私有void listNewFiles(){
文件文件=新文件(文件路径);
对于(文件f:File.listFiles()){
if(hashsetofiles.add(f)){
新发现的文件(f);
}
}
}
找到私有void newFileFound(文件f){
//他是新来的
System.out.println(f.getName());
}
私有void listAnfangFiles(){
hashSetOfFiles=新HashSet();
文件f=新文件(文件路径);
对于(文件ff:f.listFiles()){
hashsetofiles.add(ff);
}
}
私有void chooseFilePath(){
//
//JFileChooser chooser=新的JFileChooser();
//setFileSelectionMode(仅限于JFileChooser.DIRECTORIES_);
//
//if(chooser.showOpenDialog(null)=JFileChooser.APPROVE\u选项)
//filePath=chooser.getSelectedFile().getAbsolutePath();
filePath=“C:\\Users\\maurice\\Desktop\\Test”;
}
公共静态void main(字符串[]args){
新WatchDir();
}
}
它不是一条连续的线。 在
run()
方法中,没有允许线程继续连续运行的循环条件。
So
sleep(1000)播放一次,它是
run()
方法中最后一条播放的指令。返回后,
run()
方法终止,因此线程结束


编辑:具有连续线程的简单解决方案

例如,此代码允许线程永不停止,但允许进程终止:

 new Thread() {
        public void run() {

            while (true){
               listNewFiles();
               try {
                   sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
            }

        };
    }.start();
您可以有其他条件来停止循环(延迟、日期或时间、状态、按键等)。若要允许,应将其置于
while()
条件中,或置于块
中(如果(条件)中断

    boolean wantToContinue = true;
    new Thread() {
    public void run() {

        while (wantToContinue){
           listNewFiles();
           try {
               sleep(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
        }

    };
}.start();
它不是一条连续的线。 在
run()
方法中,没有允许线程继续连续运行的循环条件。
So
sleep(1000)播放一次,它是
run()
方法中最后一条播放的指令。返回后,
run()
方法终止,因此线程结束


编辑:具有连续线程的简单解决方案

例如,此代码允许线程永不停止,但允许进程终止:

 new Thread() {
        public void run() {

            while (true){
               listNewFiles();
               try {
                   sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
            }

        };
    }.start();
您可以有其他条件来停止循环(延迟、日期或时间、状态、按键等)。若要允许,应将其置于
while()
条件中,或置于块
中(如果(条件)中断

    boolean wantToContinue = true;
    new Thread() {
    public void run() {

        while (wantToContinue){
           listNewFiles();
           try {
               sleep(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
        }

    };
}.start();
使用布尔变量。因此,您可以从外部控制操作。提供真实的条件不是好的做法

使用布尔变量。因此,您可以从外部控制操作。提供真实的条件不是好的做法