Java Multi-Threading - Chương trình liệu có dừng khi thread main chết?

Ta có đoạn code sau:

class NewThread implements Runnable {
     
    Thread t;
     
    NewThread(){
        t = new Thread(this, "Demo Thread");
        System.out.println("Child Thread: " + t);
        t.start();
    }
    public void run(){
        try {
            for(int i = 5; i > 0; i--){
                System.out.println("Child Thread: " + i);
                Thread.sleep(2000);
            }
        } catch(InterruptedException ex) {
            System.out.println("Child Thread Interrupted");
        }
        System.out.println("Exitting Child Thread...");
    }
}
 
class ThreadDemo{
    public static void main(String... a){
        new NewThread();
         
        try{
            for(int i = 5; i > 0; i--) {
                 System.out.println("Main Thread: " + i);
                 Thread.sleep(1000);
            }
        }catch(InterruptedException ex) {
                System.out.println("Main Thread Interrupted");
        }
        System.out.println("Main thread exiting.");
    }
}

Trong đoạn code trên, tôi đã cố tình để cho thread con sleep 2s sau mỗi lần in ra màn hình. Còn thread main chỉ sleep 1s. Và đây là kết quả:

Như chúng ta thấy, thread main dù đã exit nhưng chương trình vẫn thực hiện tiếp thread con. Chương trình kết thúc khi thread con exit. Javadoc nói về điều này ở đây:

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.
1 Like

đoạn code của bạn chẳng chứng minh được rằng thread main đã exit, mà chỉ nói rằng thread main đã thực hiện hết lệnh mà bạn viết thôi.

3 Likes

Có gì chứng minh không bạn ơi.

Mình thấy vì cả main và thread con đều không implement kiểu deamon thread ( thread cung cấp tài nguyên dịch vụ cho thread khác) nên không thể có chuyện thread này kết thúc thì thread kia kết thúc theo.
Nếu implement NewThread theo kiểu deamon cho thread main thì có thể khi main chết NewThread sẽ tắt theo
Về deamon thread:

public void TimeOut(){
        new Thread(){
        @Override
        public void run() {
            try{
                Thread.sleep(1500);
                  for( int i = phut -1 ; i >= 0; i--){
                      if( phut == 1)
                          panelTG.setBackground(Color.red);
                      lblPhut.setText(i + "");
                      int giay = 60;
                      for( int j = giay -1 ; j>= 0; j--){
                          Thread.sleep(1000);
                          lblGiay.setText(j + "");
                          giay --;
                      }
                      phut --;
                  }
            }catch(Exception ae){
          }
        if( phut == 0){
            btnThoatActionPerformed(null);
        }
      }
        }.start();
    }

T có đoạn code set thời gian cho nó chạy ngược trong vòng 20p, tạo ra 1 thread, nhưng sau, sau khi start() cái thread, thì giá trị của phut vẫn ko thay đổi, còn trong thread thì giá trị giảm còn 0

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?