2016-08-06 4 views
1

私のプログラムに問題があります。 ダウンロードしたファイルを最後までソートしようとしています。これまでのところ、特定のファイルパスを観察し、それらのファイルをHashSet内にリストする構造があります。 私の問題は今、プログラムが数秒間実行されているが、終了コード0で終了するので、すべてが正常であるはずです。理由がなく連続スレッドを使用中にJVMが終了する

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(); 
    } 
} 

答えて

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

それは連続スレッドではありません。 run()メソッドでは、スレッドを連続して実行するループ条件はありません。
したがってsleep(1000);が一度再生され、run()メソッドで最後に再生された命令です。戻った後、run()メソッドが終了し、スレッドが終了します。


編集:たとえば連続スレッド

を持つための簡単な解決策は、このコードは、スレッドが停止したことがないことができますが、プロセスの終了:

new Thread() { 
     public void run() { 

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

     }; 
    }.start(); 

あなたは他のを持っている可能性がありループを停止させる条件(遅延、日付または時刻、状態、押されたキーなど)。それを可能にするには、while()条件またはブロックif (condition) breakに入れてください。

+0

ありがとうございます。あなたは何をすることをお勧めしますか? – mauricemertens

+0

大丈夫、ありがとう:) – mauricemertens

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

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

    }; 
}.start(); 

ブール変数を使用します。だからあなたは外から行動をコントロールすることができます。真の状態を与えることは良い習慣ではありません。

関連する問題