A thread group holds a collection of threads. The value of thread groups can be summed up by a quote from Joshua Bloch,5 the software architect at Sun who fixed and greatly improved the Java collections library in JDK 1.2:
"Thread groups are best viewed as an unsuccessful experiment, and you may simply ignore their existence."
If you've spent time and energy trying to figure out the value of thread groups (as I have), you may wonder why there was not some more official announcement from Sun on the topic, sooner than this (the same question could be asked about any number of other changes that have happened to Java over the years). The Nobel Laureate economist Joseph Stiglitz has a philosophy of life that would seem to apply here.6 It's called The Theory of Escalating Commitment:
"The cost of continuing mistakes is borne by others, while the cost of admitting mistakes is borne by yourself."
There is one tiny remaining use for thread groups. If a thread in the group throws an uncaught exception, ThreadGroup.uncaughtException( ) is invoked, which prints a stack trace to the standard error stream. If you want to modify this behavior, you must override this method.