Как я могу остановить WatchService (java)

Как я могу остановить выполнение:

key = watchService.take()

мой код:


//Watcher
public class DirectoryWatcherExample {

    public static void main(String[] args) throws IOException, InterruptedException {

        WatchService watchService = FileSystems.getDefault().newWatchService();
        //My folder
        Path path = Paths.get("D:\\java\\Input");
        
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
        WatchKey key;
        while (((key = watchService.take()) != null)) {
            
            System.out.println(key);
            System.out.println(key.toString());
            
            for (WatchEvent<?> event : key.pollEvents()) {
                if(event.context().toString().contains(".dat")){
                
                    System.out.println("FileName: "+event.context());
            
                }
            }
            key.reset();
        }

        watchService.close();
    }

}

мой код ждет выполнения той строки, можно ли как-то остановить выполнение, пробовал:

 key.cancel();
 watchService.close()

но это не дало никакого результата, подскажите как решить эту проблему?


person Evendie    schedule 23.02.2021    source источник


Ответы (1)


Метод take() для java.nio.WatchService определен для неопределенного ожидания, пока не произойдет отслеживаемое событие. Так что нет никакого способа остановить это.

Если вы не хотите ждать неопределенное время, вы можете использовать poll(), который возвращает немедленно, или poll(long timeout, TimeUnit unit), который возвращается через указанное время или когда происходит событие, что бы ни произошло раньше.

Наиболее «естественным» местом для запуска такой службы наблюдателя был бы фоновый поток, чтобы программа могла продолжать работу, пока наблюдатель ожидает искомого события. Классы Callable/Future являются хорошими кандидатами для использования здесь. Когда наблюдатель работает в Thread или Future, основная программа может остановить его, используя Thread.interrupt() или Future.cancel().

И обязательно присоединяйтесь или демонизируйте потоки, которые вы создаете, иначе ваша программа не завершится.

person gsl    schedule 23.02.2021