前Selector.select(タイムアウト)は、Javadocによればタイムアウト
0を返すこれは、少なくとも一つのチャンネルが選択された後にのみ、このセレクタのwakeupメソッドが呼び出され、現在のスレッドが中断され、または所定の戻りタイムアウト期間のいずれか早い方が終了します。
時折、それはこれらの4つの場合のいずれなし返し:チャンネルが選択さ
- 少なくとも一つの:それは0
- ウェイクアップ方法を返すが呼び出される:
wakeup
は と呼ばれていません - 現在のスレッドが中断されました:Thread.interrupted()がfalseを返します
- 与えられたタイムアウト期間が期限が切れる: https://github.com/xqbase/tuna/blob/debug/core/src/main/java/com/xqbase/tuna/ConnectorImpl.java :私はいくつかのログを追加しライン392及びライン402で私の元には
2016年3月15日に更新ログ
に応じて期限が切れていませんここで
public boolean doEvents(long timeout) { Log.v("Before Select: " + timeout); int keySize; try { keySize = timeout == 0 ? selector.selectNow() : timeout < 0 ? selector.select() : selector.select(timeout); } catch (IOException e) { throw new RuntimeException(e); } Set<SelectionKey> selectedKeys = selector.selectedKeys(); if (keySize == 0) { Log.v("After Select(0): selectedKeys=" + selectedKeys.size() + ", " + "interrupt=" + Thread.interrupted()); invokeQueue(); return false; } for (SelectionKey key : selectedKeys) { ...
はログです:
...
2016-03-15 23:07:49.695 com.xqbase.tuna.ConnectorImpl doEvents
FINE: Before Select: 8120
2016-03-15 23:07:49.696 com.xqbase.tuna.ConnectorImpl doEvents
FINE: After Select(0): selectedKeys=0, interrupt=false
2016-03-15 23:07:49.696 com.xqbase.tuna.ConnectorImpl doEvents
FINE: Before Select: 8119
2016-03-15 23:07:49.696 com.xqbase.tuna.ConnectorImpl doEvents
FINE: After Select(0): selectedKeys=0, interrupt=false
2016-03-15 23:07:49.700 com.xqbase.tuna.ConnectorImpl doEvents
FINE: Before Select: 8115
2016-03-15 23:07:49.701 com.xqbase.tuna.ConnectorImpl doEvents
FINE: After Select(0): selectedKeys=0, interrupt=false
2016-03-15 23:07:49.701 com.xqbase.tuna.ConnectorImpl doEvents
FINE: Before Select: 8114
2016-03-15 23:07:49.702 com.xqbase.tuna.ConnectorImpl doEvents
FINE: After Select(0): selectedKeys=0, interrupt=false
...
これは非常に奇妙です。選択されたキーはなく、中断はなく、タイムアウトもウェイクアップもしませんでしたが、返されました。
Javaにバグはありますか?私のJavaバージョンは1.8.0_51-b16(64ビットサーバVM)で、CentOS 6.5 x64 linodeで動作します。
いいえよく書かれた質問+1 –
このプロセスから外部プロセスを起動しますか? –
@RoeeShenberg no。ただ一つのJavaプロセスであり、他のプロセスを呼び出さない。 – auntyellow