protected void _run() { final Condition is_data_available=() -> data_available; while(running) { for(;;) { // try to receive as many msgs as possible, until no more msgs are ready or the conn is closed try { if(!_receive(false)) break; } catch(Throwable ex) { server.closeConnection(NioConnection.this, ex); state(State.done); return; } } updateLastAccessed(); // Transition to state waiting_to_terminate and wait for server.readerIdleTime() ms state(State.waiting_to_terminate); data_available=false; register(SelectionKey.OP_READ); // now we might get receive() calls again if(data_available_cond.waitFor(is_data_available, server.readerIdleTime(), TimeUnit.MILLISECONDS)) state(State.reading); else { state(State.done); return; } } }
protected void _run() { final Condition is_data_available=() -> data_available; while(running) { for(;;) { // try to receive as many msgs as possible, until no more msgs are ready or the conn is closed try { if(!_receive(false)) break; } catch(Throwable ex) { server.closeConnection(NioConnection.this, ex); state(State.done); return; } } updateLastAccessed(); // Transition to state waiting_to_terminate and wait for server.readerIdleTime() ms state(State.waiting_to_terminate); data_available=false; register(SelectionKey.OP_READ); // now we might get receive() calls again if(data_available_cond.waitFor(is_data_available, server.readerIdleTime(), TimeUnit.MILLISECONDS)) state(State.reading); else { state(State.done); return; } } }