JavaにLinuxepollに相当するものはありますか?
epollを使用すると、スレッドはさまざまな異種イベントに反応できます。たとえば、ソケットイベントまたはコンソールからの入力のいずれかに反応するスレッドを作成できます。 C++では、stdioとソケットをepollに登録することでこれを実装できます。私のスレッドは、これらのいずれかからのイベントによってトリガーされます。
Javaに同様の機能はありますか? nioパッケージを見たところ、セレクターに多数のソケットを登録できます。しかし、コンソール/標準のioをセレクターに登録することはできないようです。私は何かを見ていませんか?これを行う別の方法はありますか?
「理由」について:ソケットを介して通信するプログラムを作成したいのですが、コンソールからコマンドを入力してこのプログラムを駆動したいと思います。コンソール入力と通信を異なるスレッドに分離することでこれを行う方法は知っていますが、単一のスレッドでこれを行う方法があるかどうか知りたいです。
ありがとう。 df
Java SE6の拡張機能
Java.nio
新しいJava.nio.channels.SelectorProvider
のLinuxのepollイベント通知機能に基づいて実装が含まれています。 epoll機能は、Linux 2.6、以降、カーネルで利用可能です。 Selectorに登録されているSelectableChannelが数千ある場合、新しいepollベースのSelectorProvider実装は、従来のポーリングベースのSelectorProvider実装よりもスケーラブルです。 2.6カーネルが検出されると、デフォルトで新しいSelectorProvider実装が使用されます。プレ2.6カーネルが検出されたときに、ポーリングベースのSelectorProviderが使用されます。
https://docs.Oracle.com/javase/8/docs/technotes/guides/io/enhancements.html
はい、nio
パッケージでは、poll()
/select()
と同等の機能を提供するSelector
sを使用できます。実際、実装の1つはバックエンドとしてepoll
を使用します(これはJava.nio.channels.spi.SelectorProvider
Javaプロパティ)。セレクターは通常ネットワークソケットで使用されますが、ドキュメントのさまざまなChannel
実装を調べると、このメカニズムを標準入力でも使用できる可能性が高いと思います(古いStream
-間を移動できるヘルパークラスがあります-ベースのAPIとnio
APIはある程度)。