Reputation: 2179
I have a simple java program. A main thread (main()
) is created and starts another thread t
.
class T extends Thread{
@Override
public void run() {
while (true){
System.out.println("Inside thread");
}
}
}
public class Main {
public static void main(String[] args) {
Thread t = new T();
t.start();
//t.join();
System.out.println("end");
}
}
Output:
end
Inside thread
Inside thread
Inside thread
....
....
It infinitely prints Inside thread. I am not waiting for child thread in main thread using join(). Shouldn't main thread exit after printing end?
Update:
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.
I found the reason. The second point clarified it. I was in assumption that all child thread will terminates after main thread exits (I was wrong) and JVM should shutdown.
Upvotes: 4
Views: 3005
Reputation: 2265
The below code will run forever. please fix your while loop control logic
while (true) {
System.out.println("Inside thread");
}
Upvotes: 0
Reputation: 4818
The commented method t.join()
is exactly what is needed for the thread to wait for the end of the caller thread. See the Thread javadoc for more details
Upvotes: 0
Reputation: 8229
The thread you made is asynchronous from the main
method. Therefore, there are two processes happening after calling t.start()
. And once main
ends, the main process is done, but thread t is still going on.
To better visualize this, use a boolean variable in the condition of your thread's while loop instead of true
to make it so that the thread only prints 5 times.
class T extends Thread{
int count;
@Override
public void run() {
while (count < 5){
System.out.println("Inside thread");
count++;
}
}
}
Notice that a thread won't stop itself if there is no way to terminate it. The main method ending will not terminate a thread.
Upvotes: 0
Reputation: 73578
The main thread has exited. It's the other thread that's still alive.
Upvotes: 6