Actually, threads do require heap space to save the thread context, including a whole new stack structure. This is one of several reasons that I use thread pools instead of threads, and/or rely on state machine constructs instead of threads. Threads can be necessary or, more often, are a programming crutch, but they always consume meaningful amounts of heap memory.
See also: Stairs project - #7 by mcalsyn
One loop to run two separate asynchronous animation loops instead of a thread per animation loop.