Nach Javadoc-,Selector.select (timeout) 0 zurück, bevor Timeout
Es gibt nur, nachdem mindestens ein Kanal ausgewählt ist, ist diese Methode des Wakeup-Selektor aufgerufen wird, der aktuelle Thread unterbrochen ist, oder die gegebene Timeout-Zeit läuft ab, je nachdem, was zuerst eintritt.
Aber gelegentlich gibt sie ohne diese 4 Fälle:
- mindestens einen Kanal ausgewählt ist: es wird 0 zurückgegeben
- Wakeup Methode wird aufgerufen:
wakeup
nicht genannt
- der aktuelle Thread ist unterbrochen: Thread.interrupted() gibt false
- gegeben Timeout-Zeit abgelaufen ist: nicht nach logs abgelaufen
2016-03-15
In meiner Quelle in Zeile 392 und Zeile 402 ich einige Protokolle AKTUALISIERT hinzugefügt: https://github.com/xqbase/tuna/blob/debug/core/src/main/java/com/xqbase/tuna/ConnectorImpl.java
Hierpublic 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) {
...
ist das Protokoll:
...
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
...
Das ist sehr seltsam: keine ausgewählten Tasten, keine Unterbrechung, kein Timeout und kein Aufwecken, aber es kehrte zurück.
Gibt es einen Bug in Java? Meine Java-Version ist 1.8.0_51-b16 (64-Bit-Server-VM) und wird auf einem CentOS 6.5 x64-Lincode ausgeführt.
Gut geschriebene Frage +1 –
Starten Sie externe Prozesse von diesem Prozess? –
@RoeShenberg Nr. nur ein einziger Java-Prozess und nicht andere Prozesse aufrufen. – auntyellow