@Override public void run() { long lastsleep = 500; while (Listener.this.isStarted() && !isInterrupted()) { Date startListen = new Date(); try { Listener.this.listen(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } catch (Exception e) { Date failedListen = new Date(); if((failedListen.getTime() - startListen.getTime() < lastsleep)) lastsleep *= 2; else lastsleep = 500; try { Thread.sleep(lastsleep); } catch (InterruptedException e1) { Thread.currentThread().interrupt(); break; } log(Level.ERROR, e, "Listener thread failed: %s", e.getMessage()); } } } };