I found I had to calm my nerves by having tonnes of these Spock tests covering my Thread spawning.
I took my actual code, pasted it into this blog, stripped and rewrote it to cut straight to the point.
This silly service only illustrates the two methods for starting and stopping threads. This sample only spawns 1 thread but the point here are tests below.
To be sure your startJobs actually creates your thread(s), you should have a test confirming that first.
And here is the test looking for leakage:
The whole idea is finding the threads by your given thread name. And yes, i know Thread.sleep isn't ideal, and I may not need it, but it just feels reasonable to make sure the thread gets a little time to get going.
Side note: I learned that you have to cancel both the Timer and the TimerTask. If you only cancel the Timer, you'll have to wait for the GC to clean up the thread, and your test will fail.