#java
#java
Вопрос:
Как добавить оператор return в метод watchable в Java и при этом работать должным образом. Я хочу всегда выполнять поиск файлов, хорошо, у меня это есть. Но теперь я хочу получить return, но когда я добавляю оператор return, все идет не так, функция останавливается, и watchable тоже останавливается.. Есть идеи?
for (;;) {
WatchKey key = watcher.take();
for (WatchEvent<?> event: key.pollEvents()) {
if (event.kind() == StandardWatchEventKind.ENTRY_CREATE) {
System.out.println(event.context().toString());
}
}
Вот цикл, который всегда ищет, как вернуться из него и все еще работать?
Комментарии:
1. Что-то звучит странно. Куда вы хотите вернуть значение? Почему вы хотите вернуть это значение?
Ответ №1:
Я думаю, вы имеете в виду, что хотите выполнить другие действия в программе, при этом все еще запустив наблюдатель. Для этого вам нужно будет создать и запустить новый Thread
для наблюдателя:
Thread watcherThread = new Thread(new Runnable() {
public void run() {
// Watcher loop code goes here
}
});
watcherThread.start();
Ответ №2:
Как говорит @dlev, если вы хотите, чтобы ваше приложение обрабатывало события просмотра одновременно с выполнением других действий, то способ сделать это — в отдельном потоке.
Это оставляет вас с проблемой «возврата» информации. (Я предполагаю, что простая печать информации в стандартный вывод для вас бесполезна.)
Как вы заметили, вы не можете использовать return
, потому что это завершит цикл.
Основной ответ заключается в том, что вам нужно поместить информацию куда-нибудь, чтобы остальная часть вашего приложения могла получить доступ. Например:
-
Вы могли бы создать объект queue (например, a
ConcurrentLinkedQueue
), чтобы ваш наблюдатель поставил данные в очередь, а какой-нибудь другой поток снял их с очереди и обработал. -
Вы могли бы попросить наблюдателя обработать саму полезную нагрузку события и поместить результаты в общую структуру данных.
Однако без дополнительной информации трудно решить, какой подход будет лучшим для вас.
Комментарии:
1. для вас обоих я выберу first — Concurrentlink Queue, потому что переданных данных много, и я думаю, что это лучший вариант 🙂
2. Я хочу спросить вас кое о чем, что я делаю подобным образом.. LinkedBlockingQueue<Whatch_Directory> очередь = новая LinkedBlockingQueue<классы. Доступно для просмотра. Whatch_Directory>(); queue.put(классы. Доступно для просмотра. Whatch_Directory.create_watchable(«dir»)); но все, начиная с классов. Watchable и т.д. Это функция с классом watchable, все, что ниже него, не отображается, по-прежнему выполняется только watchable .