Nishant Kumar
Nishant Kumar

Reputation: 2179

java: why main thread waits for child thread to finish

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

Answers (4)

Yohannes Gebremariam
Yohannes Gebremariam

Reputation: 2265

The below code will run forever. please fix your while loop control logic

while (true) {
System.out.println("Inside thread");
}

Upvotes: 0

Adonis
Adonis

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

Chris Gong
Chris Gong

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

Kayaman
Kayaman

Reputation: 73578

The main thread has exited. It's the other thread that's still alive.

Upvotes: 6

Related Questions