The reason the executor doesn't die is that the thread isn't a daemon thread, so it keeps the JVM alive. See Thread.setDaemon(boolean)
.
This isn't a good time to use a finalizer. Finalizers should only be used to clean up native resources (eg resources accessed via JNI).