why does this program not end?

A

andthen

I read the following in the Thread API:

When a Java Virtual Machine starts up, there is usually a single non-daemon
thread (which typically calls the method named main of some designated
class). The Java Virtual Machine continues to execute threads until either
of the following occurs:
- The exit method of class Runtime has been called and the security manager
has permitted the exit operation to take place.
- All threads that are not daemon threads have died, either by returning
from the call to the run method or by throwing an exception that propagates
beyond the run method.

In the program below I have two Threads, the first thread reaches the end of
main() and the second thread reaches the end of run() because I see all of
the print statements. But the program doesn't terminate (I have to kill it
with Control + c) and I'm wondering why that is.

public class Test {
public static void main(String[] args) throws Exception {
Test2 h = new Test2();
System.out.println("before start");
h.start();
System.out.println("after start");
}
}


public class Test2 extends Thread {
public void run() {
System.out.println("starting run");
System.out.println("ending run");
}
}
 
S

Sudsy

andthen wrote:
public class Test {
public static void main(String[] args) throws Exception {
Test2 h = new Test2();
System.out.println("before start");
h.start();
System.out.println("after start");
}
}


public class Test2 extends Thread {
public void run() {
System.out.println("starting run");
System.out.println("ending run");
}
}

Works as expected for me, once you remove the public qualifier
from class Test2. Here's the output from 'java -version':

java version "1.4.2_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_02-b03)
Java HotSpot(TM) Client VM (build 1.4.2_02-b03, mixed mode)

Here's the output:

before start
after start
starting run
ending run

Command prompt immediately follows.
 
X

xarax

Sudsy said:
andthen wrote:
public class Test {
public static void main(String[] args) throws Exception {
Test2 h = new Test2();
System.out.println("before start");
h.start();
System.out.println("after start");
}
}


public class Test2 extends Thread {
public void run() {
System.out.println("starting run");
System.out.println("ending run");
}
}

Works as expected for me, once you remove the public qualifier
from class Test2. Here's the output from 'java -version':

java version "1.4.2_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_02-b03)
Java HotSpot(TM) Client VM (build 1.4.2_02-b03, mixed mode)

Here's the output:

before start
after start
starting run
ending run

Command prompt immediately follows.

Too late. You missed his reply. It was a D.U.E.
(Dumb User Error). The posted code is not the
same as what was failing.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,233
Latest member
AlyssaCrai

Latest Threads

Top