Nit: there are two nearly-identical methods on ExecutorService: `submit` and `execute`. In this case you want `execute`. The difference is that if the `Runnable` you pass to `execute` fails, the uncaught exception handler prints a stacktrace to the console. But with `submit` if something fails you never find out about it! (Unless you take the returned `Future` and call `get()` on it.)