Ich denke, dass die WatchService
, die in Java 7 eingeführt wurden hier von Nutzen sein kann (wenn Sie eine Datei-basierten Ansatz bevorzugen, das ist). Von der JavaDocs:
Ein Überwachungsdienst, der registrierte Objekte auf Änderungen und Ereignisse überwacht. Zum Beispiel kann ein Dateimanager einen Überwachungsdienst verwenden, um ein Verzeichnis auf Änderungen zu überwachen, so dass es seine Anzeige der Liste von Dateien aktualisieren kann, wenn Dateien erstellt oder gelöscht werden.
Grundsätzlich bedeutet dies, dass Sie eine WatchService
einrichten können, die einen Ordner für Änderungen beobachten kann. Wenn eine Änderung auftritt, können Sie auswählen, welche Aktionen ausgeführt werden sollen.
Der folgende Code verwendet die WatchService
, um einen angegebenen Ordner auf Änderungen zu überwachen. Wenn eine Änderung stattgefunden hat, führt sie eine Runnable
aus, die der Aufrufer angegeben hat (die Methode runWhenItIsTimeToExit
).
public class ExitChecker {
private final Path dir;
private final Executor executor;
private final WatchService watcher;
// Create the checker using the provided path but with some defaults for
// executor and watch service
public ExitChecker(final Path dir) throws IOException {
this(dir, FileSystems.getDefault().newWatchService(), Executors.newFixedThreadPool(1));
}
// Create the checker using the provided path, watcher and executor
public ExitChecker(final Path dir, final WatchService watcher, final Executor executor) {
this.dir = dir;
this.watcher = watcher;
this.executor = executor;
}
// Wait for the folder to be modified, then invoke the provided runnable
public void runWhenItIsTimeToExit(final Runnable action) throws IOException {
// Listen on events in the provided folder
dir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
// Run it async, otherwise the caller thread will be blocked
CompletableFuture.runAsync(() -> {
try {
watcher.take();
} catch (InterruptedException e) {
// Ok, we got interrupted
}
}, executor).thenRunAsync(action);
}
}
Also, wie verwenden wir den Checker dann? Nun, der folgende Code zeigt dies:
public static void main(String... args) throws IOException, InterruptedException {
// Setup dirs in the home folder
final Path directory = Files.createDirectories(
new File(System.getProperty("user.home") + "/.exittst").toPath());
// In this case we use an AtomicBoolean to hold the "exit-status"
AtomicBoolean shouldExit = new AtomicBoolean(false);
// Start the exit checker, provide a Runnable that will be executed
// when it is time to exit the program
new ExitChecker(directory).runWhenItIsTimeToExit(() -> {
// This is where your exit code will end up. In this case we
// simply change the value of the AtomicBoolean
shouldExit.set(true);
});
// Start processing
while (!shouldExit.get()) {
System.out.println("Do something in loop");
Thread.sleep(1000);
}
System.out.println("Exiting");
}
Schließlich, wie verlassen Sie das Programm dann? Berühren Sie einfach eine Datei im angegebenen Ordner.Beispiel:
cd ~/.exittst
touch exit-now.please
Ressourcen:
Gut für einfache Dinge, die Sie einen boolean wie 'downForMaintaince' verwenden können, und machen es'‘ wahr oder falsch als von Ihrer Notwendigkeit. dann 'while (! downForMaintance) {// endlosschleife}' –
Wie manipuliere ich diese downForMaintaince-Variable von außen? – illu
@AnirbanNag, Er meinte ohne interne "Hilfe", so dass externe Programme diesen Prozess signalisieren könnten. Diese Antworten könnten Sie leiten http://stackoverflow.com/questions/3244755/how-to-share-object-between-java-applications –