web-dev-qa-db-ja.com

Javaに同等のepollはありますか?

JavaにLinuxepollに相当するものはありますか?

epollを使用すると、スレッドはさまざまな異種イベントに反応できます。たとえば、ソケットイベントまたはコンソールからの入力のいずれかに反応するスレッドを作成できます。 C++では、stdioとソケットをepollに登録することでこれを実装できます。私のスレッドは、これらのいずれかからのイベントによってトリガーされます。

Javaに同様の機能はありますか? nioパッケージを見たところ、セレクターに多数のソケットを登録できます。しかし、コンソール/標準のioをセレクターに登録することはできないようです。私は何かを見ていませんか?これを行う別の方法はありますか?

「理由」について:ソケットを介して通信するプログラムを作成したいのですが、コンソールからコマンドを入力してこのプログラムを駆動したいと思います。コンソール入力と通信を異なるスレッドに分離することでこれを行う方法は知っていますが、単一のスレッドでこれを行う方法があるかどうか知りたいです。

ありがとう。 df

21
dfreit

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

23
lslab

はい、nioパッケージでは、poll()/select()と同等の機能を提供するSelectorsを使用できます。実際、実装の1つはバックエンドとしてepollを使用します(これはJava.nio.channels.spi.SelectorProvider Javaプロパティ)。セレクターは通常ネットワークソケットで使用されますが、ドキュメントのさまざまなChannel実装を調べると、このメカニズムを標準入力でも使用できる可能性が高いと思います(古いStream-間を移動できるヘルパークラスがあります-ベースのAPIとnioAPIはある程度)。

6