Re: threads: to join or not to join
On Wed, 27 Aug 2008 00:04:45 -0700, marlow.andrew wrote:
Does this mean there is an implicit join?
Sort of. If I look at the Sun JVM it's not an implcit join in your main
method, but it looks like at end of main DestroyVM is called which itself
waits for any non-daemon threads to terminate before it will bring down
the VM. You can see that the program below produces different outputs
depending on wether you perform a t.join() or not at the end of main.
import java.util.Arrays;
import java.util.Map;
public class D
{
public static void main(final String[] args) throws InterruptedException
{
Thread.currentThread().setName("Main thread");
ThreadGroup tg=Thread.currentThread().getThreadGroup();
while (tg.getParent()!=null) {
tg=tg.getParent();
}
final ThreadGroup top=tg;
final Thread t=new Thread(new Runnable() {
public void run()
{
for (int rounds=0; rounds<3; rounds++) {
System.out.println("--------------------");
System.out.flush();
final Map<Thread,StackTraceElement[]> stacks=Thread.getAllStackTraces
();
for (final Map.Entry<Thread,StackTraceElement[]>
entry:stacks.entrySet()) {
System.out.println("\nThread: "+entry.getKey().getName()+"\n "
+Arrays.toString(entry.getValue()).replaceAll(",","\n"));
}
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
e.printStackTrace();
System.exit(1);
}
}
}
});
t.setName("MY Thread");
t.start();
// t.join();
System.out.println("End of main");
System.out.flush();
}
}
--
Claudio Nieder, Talweg 6, CH-8610 Uster, Tel +4179 357 6743,
www.claudio.ch