/** * {@inheritDoc} */ public List<Runnable> shutdownNow() { synchronized (statelock) { List<Runnable> drained = new ArrayList<Runnable>(); if (running) { running = false; drain(getQueue(), drained); for (Runnable task : drained) { onTaskDequeued(task); } poisonAll(); //try to interrupt their current work so they can get their poison fast for (Worker w : workers.keySet()) { w.t.interrupt(); } } return drained; } }
protected void doWork(){ final Thread t_=t; while(true) { try { Thread.interrupted(); final Runnable r = getTask(); if (r == poison || r == null){ return; } onTaskDequeued(r); Throwable error = null; try { beforeExecute(t_, r); //inside try. to ensure balance r.run(); onTaskCompletedEvent(r); } catch(Throwable throwable) { error = throwable; } finally { afterExecute(t_, r, error); } } catch (Throwable throwable) { } } }