2016-04-25 13 views
0

Dies ist das Code-Snippet von FileWatcher Java 7 Nio-Bibliothek. Ist es nicht blockierender Code? Dieser Thread wartet auf das Signal von FileSystem.Wird Filewatcher in Java als nicht blockierendes IO betrachtet?

for (;;) { 
    // wait for key to be signaled 
    WatchKey key; 
    try { 
     key = watcher.take(); 
    } catch (InterruptedException x) { 
     return; 
    } 
} 
+0

Wenn es in einem Thread ausgeführt wird, der von dem Prozess getrennt ist, um den Sie sich Sorgen machen, ist es in Bezug auf den anderen Code nicht blockierend. Ein Codebeispiel innerhalb eines Threads ist nicht blockierungsfrei. –

+2

@ cricket_007: Das ist nicht das, was nicht blockierend ist. Und das hat nichts mit IO zu tun. – SLaks

+1

Nicht blockierend bedeutet in diesem Zusammenhang, dass der Benutzer-Thread, der die E/A initiiert hat, erst nach Abschluss der E/A anhält. Auf einer niedrigeren Ebene wird es einen Thread geben, dessen Aufgabe es ist, I/O-Interrupts zu behandeln und herauszufinden, was mit ihnen zu tun ist, basierend auf einer Tabelle von momentan ausstehenden Anfragen. Nachdem dieser Thread alle aktuellen Interrupts behandelt hat, wird er bis zum nächsten I/O-Interrupt blockiert. Aber Sie haben keinen Zugriff auf diesen Thread, es ist unabhängig vom Benutzercode. Abhängig davon, wie NIO implementiert wird, könnte dieser Thread Java oder im Betriebssystem sein. –

Antwort

1

Penguin Computing verwendet EPOLL, die ein Linux-Systemaufruf ist. Es ist ein Multiplex-Mechanismus, der ereignisbasiert ist. Für Windows gibt es SELECT, die das gleiche tut, aber weit weniger effizient und in BSD (auf dem OSX basiert) gibt es KQUEUE.

In einfachen Worten, was es tut ist, registriert es einen Event-Handler in dem System, das auf ein Ereignis wartet. Im Laufe der Zeit betrachtet das System alle in der Warteschlange befindlichen Event-Handler und sieht, ob es einen gibt, der bereit ist fortzufahren. Wenn es einen Event-Handler gibt, dessen Ereignis-Flag auf "true" gesetzt ist, wird das Ereignis behandelt. Wenn keine Ereignisse vorhanden sind, wird die Schleife fortgesetzt, bis ein Ereignis gefunden wird.

In der Zwischenzeit läuft der Code in main weiter und gibt Ihnen damit die "blockierungsfreie" Funktionalität, in der er verspricht.

Dies ist keine neue Technologie, obwohl ASYNC in letzter Zeit ziemlich populär geworden ist mit dem Aufkommen von NodeJS, Swift und anderen non-blocking Sprachen/Frameworks. So funktioniert die WIN32 API - kurz, es ist alles Event basierend.

Sie können einen Blick auf diese link für eine eingehendere Erklärung werfen.

+0

Wartungs- und Signalisierungsprozess im obigen Snippet ist synchron. Die "Take" -Methode wartet auf das E/A-Ereignis und der Anfangszustand von WatchKey ist bereit, bis es vom Ereignisverarbeitungssystem signalisiert wird. WatchKey muss erneut in den Bereitschaftszustand zurückgesetzt werden. Dieser Code muss in einer Endlosschleife sein, um nach den Ordner-/Dateiereignissen zu sehen. Um den Haupt-Thread zu speichern, muss der Watcher-Dienst in einem separaten Benutzer-Thread erstellt werden. – devv

Verwandte Themen