2012-01-09 37 views
6

Tôi tin rằng chủ đề chính không thể chết trước chuỗi con. Nhưng có cách nào để kiểm tra điều đó không? Tôi đã viết một chương trình đơn giản dưới đây. Bất cứ ai có thể chứng minh nó thực tế để lại lý thuyết sang một bên?Chủ đề chính có thể chết trước chủ đề con

class childre extends Thread 
{ 
    public void run() 
    { 
     for(int i=0 ; i<10 ;i++) 
     { 
      System.out.println(" child " + i); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public class ChildThreadb4main 
{ 

/** 
* @param args 
*/ 
    public static void main(String[] args) 
    { 
    // TODO Auto-generated method stub 

     System.out.println("main"); 

     childre c1 = new childre(); 

     c1.start(); 
     for(int i=0;i<5;i++) 
     { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     System.out.println(" child thread alive ? " + c1.isAlive()); 
    } 
} 

Sau khi gợi ý từ James. Tôi đã thử chương trình sau.

public class MainChildDie { 

    public static void main(String ar[]){ 

     final Thread mainThread = Thread.currentThread(); 
     System.out.println("main run "); 

     new Thread(){   

      public void run(){ 

       Thread childThread= Thread.currentThread(); 
       for(int i=0; i<10;i++){ 
        System.out.println("child"+i); 

        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
       System.out.println("main alive " + mainThread.isAlive()); 
      } 
     }.start();  
    } 
} 
+0

Không có gì đặc biệt về chuỗi "chính". Nó chỉ là một trong những đầu tiên bạn nhìn thấy (có những người khác mà là daemon chủ đề) Nếu bạn thực hiện tất cả các "nền" chủ đề của bạn, daemon chủ đề, chương trình sẽ thoát ra khi thoát chính. Nếu không, chương trình sẽ tiếp tục chạy. –

Trả lời

6

Từ http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html:

Java Virtual Machine tiếp tục thực hiện chủ đề cho đến khi một trong hai sau đây xảy ra:

  1. Phương pháp thoát của lớp Runtime đã được gọi và an ninh người quản lý đã cho phép hoạt động xuất cảnh diễn ra.

  2. Tất cả các chủ đề mà không phải là chủ đề daemon đã chết, hoặc bằng cách trở về từ cuộc gọi đến phương pháp chạy hoặc bằng cách ném một ngoại lệ mà truyền ngoài phương pháp chạy.

Trong trường hợp của bạn, khi các chủ đề chính chết, JVM không thoát, bởi vì bạn vẫn còn có các chủ đề đã tạo chạy, và họ đang daemon theo mặc định, vì điều này:

Chủ đề mới được tạo ban đầu được đánh dấu là một chuỗi daemon nếu và chỉ khi chuỗi tạo nó hiện được đánh dấu là một chuỗi daemon. Phương thức setDaemon có thể được sử dụng để thay đổi xem một chuỗi có phải là một daemon hay không.

Cite: http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#setDaemon(boolean)

+3

Để thêm vào, không có khái niệm về chủ đề cha-con (và không có điều như một chủ đề con). Mỗi sợi chỉ là một thực thể độc lập. – Manish

+0

@ManishSharma - đúng, hầu như không có cà vạt ngoại trừ những thứ như trạng thái daemon đang chuyển sang. – James

+0

Đồng ý. Không có cách nào để kiểm tra trạng thái của tên chủ đề chính? – randeepsp

0
Thread.currentThread().getThreadGroup().activeCount() 

sẽ trở lại với chủ đề hoạt động của một ThreadGroup vỡ nợ thread hiện chính

class childre extends Thread 
{ 
    public void run() 
    { 
     for(int i=0 ; i<10 ;i++) 
     { 
      System.out.println(" child " + i); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    System.out.println(Thread.currentThread().getThreadGroup().activeCount()); 
    } 
} 
+0

@ James và @ Amit Im hơi bối rối một chút. nếu tôi thêm --System.out.println (Thread.currentThread(). getThreadGroup(). activeCount()); - vào phương thức chạy lớp bên trong của lớp MainChildDie, sau đó nó trả về số đếm hoạt động là 2. trong khi câu lệnh trước nói chính còn sống là false? bây giờ họ biểu hiện gì? – randeepsp

+0

@randeepsp, tôi tin rằng luồng thực thi chính đã hoàn thành quá trình thực thi của nó và chuỗi đã chết.Activecount là bằng cách nào đó có vẻ bối rối với tôi là tốt, như nó nói trong API thr rằng nó nên được sử dụng onlu cho mục đích thông tin mà thôi. Tôi cũng đã buộc các chủ đề chính để ném ngoại lệ và nó chấm dứt trong khi các chủ đề được tạo ra bởi nó vẫn chạy trong nền và activeCount vẫn còn hai. Vì vậy, nó làm tôi bối rối và khiến tôi nghĩ rằng chủ đề chính vẫn còn hoạt động. –

0

Bạn có thể sử dụng 'tham gia' phương pháp để đảm bảo rằng chờ đợi chủ đề chính cho đến khi các chủ đề con được hoàn thành.

childre c1 = new childre(); 
c1.start(); 
try { 
c1.join(); 
} catch (InterruptedException exception) { 
    exception.printStackTrace(); 
} 
+0

tôi không muốn làm điều đó. tôi muốn kiểm tra thực tế nếu tên chủ đề chính có thể chết trước khi các chủ đề khác nó đã sinh ra. – randeepsp

6

Khi mã đang thực thi, hãy đổ toàn bộ chuỗi và xem tất cả các chủ đề đang hoạt động.

class AnotherClass { 
    public static void main(String arrp[]) throws Exception { 
     Thread t = new Thread() { 
      public void run() { 
       while (true) { 
         // do nothing 
       } 
      } 
     }; 
     t.start(); 
      //Sleep for 15 seconds 
     Thread.sleep(15000); 
    } 
} 

Compile và Execute nó:

$ javac AnotherClass.java 
$ java AnotherClass 

Tìm quá trình:

$ ps -ef | grep AnotherClass 

nikunj <<10720>> 10681 2 12:01:02 pts/9  0:04 java AnotherClass 
nikunj 10722 10693 0 12:01:05 pts/6  0:00 grep Another 

Đi bãi Ðề tài:

$ kill -3 <<10720>> 

Output (trích đoạn):

"main" prio=10 tid=0x00039330 nid=0x1 waiting on condition [0xffbfe000..0xffbfe2a8] 
    at java.lang.Thread.sleep(Native Method) 
    at AnotherClass.main(AnotherClass.java:12) 

"Thread-0" prio=10 tid=0x00a1b770 nid=0x12 runnable [0xadc7f000..0xadc7f970] 
    at AnotherClass$1.run(AnotherClass.java:7) 

Đi Một bãi Thread (sau 15 giây):

$ kill -3 <<10720>> 

New Output (trích đoạn):

"Thread-0" prio=10 tid=0x00a1b770 nid=0x12 runnable [0xadc7f000..0xadc7f970] 
    at AnotherClass$1.run(AnotherClass.java:7) 

Kết luận: chính đã biến mất.

0
class Print implements Runnable 
{ 
    Thread thread, mainThread; 
    Print(Thread t) 
    { 
     mainThread = t; 
     thread = new Thread(this, "Thread"); 
     thread.start(); 
    } 
    @Override 
    public void run() 
    { 
     for(int i = 0; i < 5; i++) 
     { 
      System.out.println(thread.getName() + "\t" + (i+1)); 
      try 
      { 
       Thread.sleep(1000); 
      } 
      catch(InterruptedException ie) 
      { 
       System.out.println("Interrupted Exception " + thread.getName()); 
      } 
      System.out.println("Is main thread alive "+mainThread.isAlive()); 
     } 
    } 
} 
public class ThreadOne 
{ 
    public static void main(String[] args) 
    { 
     Print p1 = new Print(Thread.currentThread()); 
     System.out.println("Main Thread Ends"); 
    } 
} 

Đoạn mã trên sẽ cho bạn biết rằng luồng chính đã hoàn thành khi thực hiện lệnh mớiThread được khởi chạy.

Các vấn đề liên quan