2017-05-16 4 views
1

ファイルをアップロードする準備ができているかどうかを定期的に確認してすぐにアップロードし、すぐにスレッドを停止します。また、長い時間が経過した場合、準備ができていないファイルに関係なくスレッドを停止したいが、runメソッド自体の内部ではスレッドを停止することはできない。スレッドを定期的に実行し、条件が満たされた後、またはそれを停止します。

final ScheduledFuture<?> fileUploadedFuture = scheduler.scheduleAtFixedRate(() -> { 
     try { 
      if (fileReady("xyz.txt")) { 
       uploadFile("xyz.txt") 
       //cancel fileUploadedFuture and fileUploadedFutureCanceller 
      } 
     } catch (Exception e) { 
      throw new ServiceException(e); 
     } 
    }, 0, delay, TimeUnit.SECONDS); 

    final ScheduledFuture<?> fileUploadedFutureCanceller = scheduler.schedule(() -> { 
     fileUploadedFuture.cancel(true); 
    }, 60, TimeUnit.SECONDS); 
} 
+1

あなたはJavaでwatchServiceを使用することができますが参照をhttps://docs.oracle.com/javase/tutorial /essential/io/notification.html –

答えて

0

ScheduledThreadPoolExecutorの使用はどうですか?

public class TestExecutor { 
    private static ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1); 

    private static class PushFile implements Runnable { 
     @Override 
     public void run() { 
      if (new File("test.txt").exists()) { 
       System.out.println("found it!"); 
       exec.shutdown(); 
      } else { 
       System.out.println("waiting"); 
      } 
     } 

    } 

    private static class ShutMeDown implements Runnable { 
     @Override 
     public void run() { 
      System.out.println("timeout"); 
      exec.shutdown(); 
     } 
    } 

    public static void main(String[] args) { 
     exec.scheduleWithFixedDelay(new PushFile(), 0, 1, TimeUnit.SECONDS); 
     exec.scheduleWithFixedDelay(new ShutMeDown(), 10, 1, TimeUnit.SECONDS); 
    } 
} 
+0

スケジューラをシャットダウンすることはできますが、スケジューラはローカルではなく、他の目的で使用されているので、ちょうど正しいスレッドを削除し、全体をシャットダウンしないでくださいもの。 – CCC

0

@laughing buddhaがウォッチャーを提案しました。おそらく私の最初の提案よりもリソース効率が良いでしょうが、まだスレッドを駐車しているので、このケースでは適切な解決策ではないと私は完全には分かりません。それでも、私はテストをコード化し、それは短く、読みやすいですので、あなたにもコードを持っていることがあります。

public class TestWatchService { 

    public static void main(String[] args) throws IOException, InterruptedException { 
     WatchService watcher = FileSystems.getDefault().newWatchService(); 
     Path file = Paths.get("."); 
     WatchKey key = file.register(watcher, StandardWatchEventKinds.ENTRY_CREATE); 

     List<WatchEvent<?>> events = new ArrayList<>(); 
     for (boolean done = false; ! done; events = key.pollEvents()) { 
      if (events.size()==0) { 
       System.out.println("waiting"); 
       Thread.sleep(2000L); 
      } else { 
       System.out.println("got it!"); 
       done = true; 
      } 
     } 
    } 
} 
+0

現在のディレクトリにある新しいファイルをタッチしてテストします。特定のファイル名などを確認するためにコードを更新する必要があります。 –

+0

ありがとうございます。しかし、私はファイルの部分には本当に興味がありません。それはほんの一例でした。 – CCC

関連する問題