void () { try { boolean stopSignalled = false; while (true) { final boolean read = readAvailable(); if (stopSignalled || mySleepingPolicy == SleepingPolicy.BLOCKING) { break; } stopSignalled = isStopped; if (!stopSignalled) { // if process stopped, there is no sense to sleep, just check if there is unread output in the stream beforeSleeping(read); synchronized (mySleepMonitor) { mySleepMonitor.wait(mySleepingPolicy.getTimeToSleep(read)); } } } } catch (IOException e) { if (LOG.isDebugEnabled()) { LOG.debug(e); } } catch (Exception e) { if (!(e instanceof ControlFlowException)) { LOG.error(e); } } finally { flush(); try { close(); } catch (IOException e) { LOG.error("Can't close stream", e); } } }