2012-05-16 24 views
16

Javaに相当するLinux epollはありますか?Javaにepoll相当版はありますか?

epollは、スレッドが多数の異種イベントに反応することを許可します。たとえば、ソケットイベントまたはコンソールからの入力のいずれかに反応するスレッドを持つことができます。 C++では、stdioとソケットをepollに登録することでこれを実装できます。私のスレッドは、これらのいずれかのイベントからトリガーされます。

Javaにも同様の機能がありますか?私はnioパッケージを見て、セレクタを使っていくつかのソケットを登録することができます。しかし、コンソール/標準ioをセレクタに登録することは遠慮されていないようです。私は何かを見ていないのですか?これを行う別の方法がありますか?

"なぜ":ソケットを介して通信するプログラムを書いていますが、コンソールからコマンドを入力してこのプログラムを運転したいと思います。私はこれがコンソール入力と別のスレッドに通信を分離することによってどのように行うことができます知っているが、私は1つのスレッドでこれを行う方法があるかどうか不思議です。

ありがとうございました。 DF

+4

あなたが戻って一歩を踏み出すとあなたがこれをしたい_why_説明するために、あなたの投稿を編集することはできますか? – Gray

+0

OK、投稿を更新しました。 – dfreit

+0

私は標準の 'コンソール入力'はおそらく 'System.in'だろうと思っています(ただし、参照を挿入する必要がありますが、ハードコードは使用しないでください)。しかし、それはイベントを生成するようには見えません(つまり、 'register()'や同様のメソッドはありません)ので、あなたが望むようなデフォルトの動作はないと思います。この動作を提供するために何かを書く(または見つける)必要があります。 –

答えて

4

はい、nioパッケージはpoll()/select()、実際の実装の一つの機能性同等物を供給Selector Sの使用は、バックエンドとしてepoll使用(これはjava.nio.channels.spi.SelectorProvider Javaプロパティを介して選択される)ことができます。セレクタは通常ネットワークソケットで使用されますが、異なるChannelの実装をドキュメントで調べると、このメカニズムを標準入力でも使用できるようになると思います(古いものとの間の移動を許可するヘルパークラスがあります)Stream - APIをnioとすることもあります)。 Java SEの6

java.nioの

のLinuxのepollイベント通知機能に基づく新しいjava.nio.channels.SelectorProvider実装の

+2

できません。 'SelectableChannel'ではない' Selector'でどんなチャンネルも登録することはできず、唯一の 'SelectableChannels'はソケットチャンネルとパイプチャンネルです。 – EJP

19

機能強化が含まれています。 epoll機能は、Linux 2.6以降のカーネルで利用可能です。新しいepollベースのSelectorProvider実装は、セレクタに登録された数千のSelectableChannelsがある場合、従来のポーリングベースのSelectorProvider実装よりも拡張性があります。新しいSelectorProvider実装は、2.6カーネルが検出されたときにデフォルトで使用されます。ポーリングベースのSelectorProviderは、2.6より前のカーネルが検出されたときに使用されます。

https://docs.oracle.com/javase/8/docs/technotes/guides/io/enhancements.html

+0

これはLinux以外のJava実装に移植可能ですか?また、コンソール上で 'SelectorProvider'を得ることができますか? – Gray

関連する問題