The Artima Developer Community
Sponsored Link

Legacy Java Answers Forum
October 2000



This page contains an archived post to the Java Answers Forum made prior to February 25, 2002. If you wish to participate in discussions, please visit the new Artima Forums.


activeCount() and enumerate() inconsistency

Posted by Jose Botella Rojas on October 04, 2000 at 2:59 PM

I was running the following example in the Bruce Eckel excellent
book Thinking in Java 2edt. when it printed a NullPointerException
in the marked line:

// From 'Thinking in Java, 2nd ed.' by Bruce Eckel
// See copyright notice in CopyRight.txt.
// How thread groups control priorities
// of the threads inside them.

public class ThreadGroup1 {
public static void main(String[] args) {
// Get the system thread & print its Info:
ThreadGroup sys =
sys.list(); // (1)
// Reduce the system thread group priority:
sys.setMaxPriority(Thread.MAX_PRIORITY - 1);
// Increase the main thread priority:
Thread curr = Thread.currentThread();
curr.setPriority(curr.getPriority() + 1);
sys.list(); // (2)
// Attempt to set a new group to the max:
ThreadGroup g1 = new ThreadGroup("g1");
// Attempt to set a new thread to the max:
Thread t = new Thread(g1, "A");
g1.list(); // (3)
// Reduce g1's max priority, then attempt
// to increase it:
g1.setMaxPriority(Thread.MAX_PRIORITY - 2);
g1.list(); // (4)
// Attempt to set a new thread to the max:
t = new Thread(g1, "B");
g1.list(); // (5)
// Lower the max priority below the default
// thread priority:
g1.setMaxPriority(Thread.MIN_PRIORITY + 2);
// Look at a new thread's priority before
// and after changing it:
t = new Thread(g1, "C");
g1.list(); // (6)
t.setPriority(t.getPriority() -1);
g1.list(); // (7)
// Make g2 a child Threadgroup of g1 and
// try to increase its priority:
ThreadGroup g2 = new ThreadGroup(g1, "g2");
g2.list(); // (8)
g2.list(); // (9)
// Add a bunch of new threads to g2:
for (int i = 0; i < 5; i++)
new Thread(g2, Integer.toString(i));
// Show information about all threadgroups
// and threads:
sys.list(); // (10)
System.out.println("Starting all threads:");
Thread[] all = new Thread[sys.activeCount()];
for(int i = 0; i < all.length; i++)
if(!all[i].isAlive()) //THIS IS THE OFFENDING LINE
// Suspends & Stops all threads in
// this group and its subgroups:
System.out.println("All threads started");
sys.suspend(); // Deprecated in Java 2
// Never gets here...
System.out.println("All threads suspended");
sys.stop(); // Deprecated in Java 2
System.out.println("All threads stopped");
} ///:~

So I tried the following snippet code that reproduces the same
error, unless you unremark the lines that start the threads:
"primera.start()" and "segunda.start()".
It seems that activeCount() returns the number of the "active"
threads created, regardless they were started or not; unlike
enumerate() that only return the references of those "active"
threads that has been started. In other words what an active
thread is?

Thank you for your attention.

public class Test5 {
public static void main(String[] args) {
Thread primera = new Thread("primera");
Thread segunda = new Thread("segunda");
int active = Thread.currentThread().getThreadGroup().activeCount();
Thread[] list = new Thread[active];
static void print() {
static void printFor(Thread[] list) {
for (int i=0; i System.out.println(list[i].getName());


Sponsored Links

Copyright © 1996-2009 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use - Advertise with Us