<p>Most <code>ExecutorService</code> objects must be explicitly shutdown, otherwise, their internal threads can prevent the JVM from ever shutting down, even when everything else has stopped.</p>

<p>FindBugs has detected that something like the following is happening:<br/>
<code>
ExecutorService executor = ... //e.g. Executors.newCachedThreadPool();<br/>
...<br/>
public void reset() {<br/>
&nbsp;&nbsp;&nbsp;this.executor = Executors.newCachedThreadPool(); <br/>
&nbsp;&nbsp;&nbsp;this.executor.execute(new SampleExecutable()); <br/>
}<br/>
</code>
For normal objects, losing the last reference to them like this would trigger the object to be cleaned up
in garbage collection.  For <code>ExecutorService</code>s, this isn't enough to terminate the internal threads in the
thread pool, and the <code>ExecutorService</code> isn't guaranteed to shutdown, causing the JVM to never stop. <br/>
To fix this, simply add a call to <code>shutdown()</code> like this:<br/>
<code>
ExecutorService executor = ... //e.g. Executors.newCachedThreadPool();<br/>
...<br/>
public void reset() {<br/>
<b>&nbsp;&nbsp;&nbsp;this.executor.shutDown();</b> <br/>
&nbsp;&nbsp;&nbsp;this.executor = Executors.newCachedThreadPool(); <br/>
&nbsp;&nbsp;&nbsp;this.executor.execute(new SampleExecutable()); <br/>
}
</code>
</p>

<p>Even though there are some exceptions to this, particularly when a custom <code>ThreadFactory</code> is
provided, or for <code>ThreadPoolExecutor</code>s with <code>allowsCoreThreadTimeOut()</code> set to true,
it is good practice to explictly shutdown the <code>ExecutorService</code> at the end of execution, or
when it is being replaced.</p>

<p><b>Note:</b> <code>ExecutorService</code>s are generally created once in a program's lifecycle.  If you find yourself
replacing the <code>ExecutorService</code>, perhaps you may consider restructuring your code to use calls like
<code>awaitTermination()</code> or <code>Future</code>s/<code>Callable</code>s to avoid recreating the <code>ExecutorService</code>.</p>