When stopping, UIMA AS doesnt call AE.destroy() method on the same thread that was used to initialize the AE. Also, UIMA AS thread factory (source of threads which process CASes) sets each thread as daemon resulting in a premature exit of a process. The jvm is free to exit if all threads complete their run() method or all remaining threads in the jvm are daemon threads. This premature exit prevents UIMA AS from completing call to destroy() method on each AE. Refactor code involved in UIMA AS process shutdown.