Secondo Javadoc,Selector.select (timeout) restituisce 0 prima del timeout
Esso restituisce solo dopo aver selezionato almeno un canale, il metodo sveglia di questo selettore viene richiamato, il thread corrente viene interrotta, oppure la data il periodo di timeout scade, a seconda dell'evento che si verifica per primo.
ma occasionalmente restituisce senza di questi 4 casi:
- almeno un canale viene selezionato: restituisce metodo 0
- riattivazione viene richiamato:
wakeup
non è chiamato - il thread corrente viene interrotto: Thread.interrupted() restituisce false .515.053.691,36321 milioni
- determinato periodo di timeout: non superata in base ai registri
AGGIORNAMENTO 2016-03-15
Nella mia fonte alla linea 392 e la linea 402 ho aggiunto alcuni registri: https://github.com/xqbase/tuna/blob/debug/core/src/main/java/com/xqbase/tuna/ConnectorImpl.java
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) {
...
Ecco il log:
...
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
...
Questo è molto strano: nessun tasto selezionato, nessuna interruzione, nessun timeout e nessuna sveglia, ma è tornato.
C'è un errore in Java? La mia versione Java è 1.8.0_51-b16 (VM server a 64 bit) ed è eseguita su un linodo CentOS 6.5 x64.
Bella domanda ben scritta +1 –
Avvia processi esterni da questo processo? –
@RoeeShenberg n. solo un singolo processo java e non chiamare altri processi. – auntyellow