2016-02-15 6 views
-1

Привет, ребята У меня есть вопрос, что, как выполнить задачу в фоновом режиме в JavaFXЗапуск фоновой задачи в JavaFX

В настоящее время ситуация такова, что я создал функции копирования в JavaFX, она работает абсолютно нормально, но если у нас больше файлов, то он переходит в не отвечающий режим до тех пор, пока процесс не завершится, журналы также не будут напечатаны в моем текстовом поле. Каждый файл копируется в уважаемой папке, но проблема в том, что он висит до завершения процесса,

И еще один вопрос, как запустить эту программу навсегда, означает, что когда новый файл поступает в исходный каталог, он автоматически переходит в целевой каталог.

Вот мой код

try 
     { 
      sourceFile = new File(sourcePath).listFiles(); 
      syslog.appendText("\nTotal Files in the Directory : " + sourceFile.length); 
      for(int i = 0; i<sourceFile.length;i++) 
      { 
       if(sourceFile[i].isFile()) 
       { 
        String file = sourceFile[i].getName(); 
        String extension = Files.getFileExtension(file); 
        if(!new File(destinationPath+"/"+extension.toUpperCase()).exists()) 
        { 
         if(new File(destinationPath+"/"+extension.toUpperCase()).mkdir()) 
         { 
          syslog.appendText("\nDirectory Created : " + destinationPath+"/"+extension.toUpperCase()); 
          try 
          { 
           if(!new File(destinationPath+"/"+extension.toUpperCase()+"/"+file).exists()) 
           { 
            syslog.appendText("\nFile "+file+" is processing to copy to "+destinationPath+"/"+extension.toUpperCase()); 
            copyFile(sourceFile[i],new File(destinationPath+"/"+extension.toUpperCase()+"/"+file)); 
            syslog.appendText("\nFile "+file+" is successfully copied to "+destinationPath+"/"+extension.toUpperCase()); 
            if(sourceFile[i].delete()) 
             syslog.appendText("\nFile "+file+" is successfully deleted from "+sourcePath); 
            else 
             syslog.appendText("\nError in deleting File "+file+" from "+sourcePath); 
           } 
          } 
          catch(Exception e) 
          { 
           e.printStackTrace(); 
           syslog.appendText("\nSome Error Occurred while copying the File : "+sourceFile[i]); 
          } 
         } 
        } 
        else 
        { 
         try 
         { 
          if(!new File(destinationPath+"/"+extension.toUpperCase()+"/"+file).exists()) 
          { 
           syslog.appendText("\nFile "+file+" is processing to copy to "+destinationPath+"/"+extension.toUpperCase()); 
           copyFile(sourceFile[i],new File(destinationPath+"/"+extension.toUpperCase()+"/"+file)); 
           syslog.appendText("\nFile "+file+" is successfully copied to "+destinationPath+"/"+extension.toUpperCase()); 
           if(sourceFile[i].delete()) 
            syslog.appendText("\nFile "+file+" is successfully deleted from "+sourcePath); 
           else 
            syslog.appendText("\nError in deleting File "+file+" from "+sourcePath); 
          } 
         } 
         catch(Exception e) 
         { 
          e.printStackTrace(); 
          syslog.appendText("\nSome Error Occurred while copying the File : "+sourceFile[i]); 
         } 
        } 
       } 
      } 
      syslog.appendText("\nFinished.........."); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

И это копия Функция

private static void copyFile(File source, File destination) 
     throws IOException { 
    FileChannel inputChannel = null; 
    FileChannel outputChannel = null; 
    try { 
     inputChannel = new FileInputStream(source).getChannel(); 
     outputChannel = new FileOutputStream(destination).getChannel(); 
     outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); 
    } finally { 
     inputChannel.close(); 
     outputChannel.close(); 
    } 
} 

ответ

0

Вам необходимо создать задачу и добавить его в новый поток. Это выглядит следующим образом:

 Task<T> backgroundTask = new Task<T>() { 
     @Override 
     protected T call() throws Exception { 
      return null; 
     } 

     @Override 
     public void run() { 
      try { 
        copyFile(source,destination); //or any other operation you want to have in a thread. 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
       } 
     } 
    }; 
    Thread backgroundThread = new Thread(backgroundTask); 
    backgroundThread.setDaemon(true); //true if you want to have it running excuslivly when having your parent-threat running 

Вы можете позвонить и запустить эту нить один раз

backgroundThread.run(); 

Futher вы можете проверить состояние резьбы с

backgroundThread.state(); 

, который может быть полезным, если вы хотите проверить, например если ваш поток все еще находится в процессе.

Рассмотрите столкновение с вашей javafx-нитью. Если вы хотите изменить объект, который доступен в JavaFX-нить вам нужно выполнить

Platform.runLater(new Runnable() {/*your impact on javafx*/}); 
1

Я бы sugest использовать задачу, что-то вроде этого:

public class CopyFileTask<Void> extends Task<Void> { 

    @Override 
    protected void succeeded() { 
     super.succeeded(); 
     // e.g. show "copy finished" dialog 
    } 

    @Override 
    protected void running() { 
     super.running(); 
     // e.g. change mouse courser 
    } 

    @Override 
    protected void failed() { 
     super.failed(); 
     // do stuff if call threw an excpetion 
    } 

    @Override 
    protected Void call() { 
     // do expensive the expensive stuff 
     copyStuff(source, destination) 
     return null ; 
    } 
} 

Методы удобства succeeded , running и failed выполняются в потоке GUI JavaFX, а материал в call выполняется в другом потоке. Для выполнения этой задачи, я хотел бы предложить, чтобы представить его в ExecuterService

ExecutorService exService = Executors.newSingleThreadExecutor(); 
exService.submit(new CopyFileTask()); 
+1

Не забудьте позвонить [ 'exService.shutdown()'] (https://docs.oracle.com/javase/8/docs/api /java/util/concurrent/ExecutorService.html#shutdown--) на каком-то этапе (обычно это приложения '' stop() ') (https://docs.oracle.com/javase/8/javafx/api/javafx/ application/Application.html # stop--)), чтобы завершить работу службы-исполнителя, когда она больше не нужна и позволит вашей программе изящно выйти. Либо это, либо создать ExecutorService с новой фабрикой потоков, предоставляющей потоки демона. – jewelsea

Смежные вопросы