== Why is this an issue? The `ThreadGroup` class contains many deprecated methods like `allowThreadSuspension`, `resume`, `stop`, and `suspend`. Also, some of the non-deprecated methods are obsolete or not thread-safe, and still others are insecure (`activeCount`, `enumerate`). For these reasons, any use of `ThreadGroup` is suspicious and should be avoided. == How to fix it Instead, use implementations of `java.util.concurrent.ExecutorService` to safely manage groups of threads. === Code examples ==== Noncompliant code example [source,java] ---- class NetworkHandler { void startThreadInGroup(ThreadGroup tg) { // Noncompliant, use an ExecutorService instead, which is more secure Thread thread = new Thread(tg, "controller"); thread.start(); } } ---- ==== Compliant solution [source,java] ---- class NetworkHandler { void handleThreadsProperly() { ThreadFactory threadFactory = Executors.defaultThreadFactory(); ThreadPoolExecutor executorPool = new ThreadPoolExecutor(3, 10, 5, TimeUnit.SECONDS, new ArrayBlockingQueue(2), threadFactory); for (int i = 0; i < 10; i++) { executorPool.execute(new Thread("Job: " + i)); } executorPool.shutdown(); } } ---- == Resources * https://wiki.sei.cmu.edu/confluence/x/YzdGBQ[CERT, THI01-J.] - Do not invoke ThreadGroup methods ifdef::env-github,rspecator-view[] ''' == Implementation Specification (visible only on this page) === Message Remove this use of "ThreadGroup". Prefer the use of "ThreadPoolExecutor". endif::env-github,rspecator-view[]