2016-04-25 3 views
0

これは、FileWatcher java 7 nio libraryのコードスニペットです。 非ブロックコードですか?このスレッドはFileSystemからの信号を待ちます。FilewatcherはJavaのIOを非ブロックと見なしますか?

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

あなたが懸念しているプロセスとは別のスレッドで実行されている場合、それは他のコードに対して非ブロッキングです。スレッド内のコードのサンプルは非ブロックではありません –

+2

@ cricket_007:これはノンブロッキングの意味ではありません。それはIOとは関係ありません。 – SLaks

+1

ここでは、非ブロックとは、I/Oを開始したユーザースレッドが、I/Oが完了するまで一時停止しないことを意味します。いくつかの下位レベルでは、I/O割り込みを処理し、現在保留中の要求のテーブルに基づいてそれらと何をするべきかを把握するスレッドを作成します。そのスレッドは、現在の割り込みをすべて処理した後、次のI/O割り込みまでブロックします。しかし、あなたはそのスレッドにアクセスできない、それはユーザーコードとは無関係です。 NIOがどのように実装されているかに応じて、そのスレッドはJavaまたはオペレーティングシステムになる可能性があります。 –

答えて

1

Filewatcherは、LinuxシステムコールであるEPOLLを使用します。イベントベースの多重化メカニズムです。 WindowsではSELECTが同じことをしますが、はるかに効率が悪く、BSD(OSXのベース)にはKQUEUEがあります。

簡単に言えば、イベントハンドラは、イベントが発生するのを待機しているシステムに登録されています。時間が経過すると、システムはすべてのキューに入れられたイベントハンドラを見て、処理する準備ができているものがあるかどうかを確認します。イベントフラグがtrueに設定されているイベントハンドラがある場合、そのイベントを処理します。イベントがない場合は、発生したイベントが見つかるまでループし続けます。

その間、mainのコードは引き続き実行されるため、「非ブロック」機能が提供されます。

これは新技術ではありませんが、最近、NodeJS、Swift、その他の非ブロッキング言語/フレームワークの登場とともに、ASYNCがかなり普及しています。これと同じ種類のものは、WIN32 APIの仕組みです。ベース。

詳細については、linkをご覧ください。

+0

上記のスニペットでの待機およびシグナリングプロセスは同期的です。 "take"メソッドはI/Oイベントを待機し、WatchKeyの初期状態はイベント処理システムによって通知されるまで待機します。この場合も、WatchKeyをリセットして準備完了状態に戻す必要があります。このコードは、フォルダ/ファイルイベントを監視するために無限ループでなければなりません。メインスレッドを保存するには、Watcherサービスを個別のユーザースレッドで作成する必要があります。 – devv

関連する問題