One of the more complicated parts of any language is dealing with multiple threads trying to access the same data and sharing the same limited resources. Sometimes a thread need only know about itself, and other times it has to be triggered by external events.
Threads are complicated, so only use them when there is no alternative, when it is dangerous not to do so.
[thread.static] Synchronize on static method
[thread.daemon] Non daemon 'user' threads prevent shutdown
[thread.timing] Running a thread for a limited time