##不帶join,不帶daemon:java
package hellojava; import java.util.logging.Level; import java.util.logging.Logger; public class HelloJava { static class TestTask implements Runnable { private String taskName; public TestTask(String taskName) { this.taskName = taskName; } @Override public void run() { for (int i=0; i<4; i++) { System.out.println(taskName + ": " + i); try { Thread.currentThread().sleep(1*1000); } catch (InterruptedException ex) { Logger.getLogger(HelloJava.class.getName()).log(Level.SEVERE, null, ex); } } } } public static void main(String[] args) { System.out.println("main thread start!"); Thread t1 = new Thread(new HelloJava.TestTask("a")); Thread t2 = new Thread(new HelloJava.TestTask("b")); t1.start(); t2.start(); System.out.println("main thread end!"); } }
運行輸出:jvm
main thread start! a: 0 main thread end! b: 0 a: 1 b: 1 a: 2 b: 2 a: 3 b: 3
能夠看到,t1和t2交替運行,再main線程結束後,t1和、t2仍在運行。ide
##jointhis
package hellojava; import java.util.logging.Level; import java.util.logging.Logger; public class HelloJava { static class TestTask implements Runnable { private String taskName; public TestTask(String taskName) { this.taskName = taskName; } @Override public void run() { for (int i=0; i<4; i++) { System.out.println(taskName + ": " + i); try { Thread.currentThread().sleep(1*1000); } catch (InterruptedException ex) { Logger.getLogger(HelloJava.class.getName()).log(Level.SEVERE, null, ex); } } } } public static void main(String[] args){ System.out.println("main thread start!"); Thread t1 = new Thread(new HelloJava.TestTask("a")); Thread t2 = new Thread(new HelloJava.TestTask("b")); // t1.setDaemon(true); // 這句注不註釋都不影響結果 t1.start(); try { t1.join(); } catch (InterruptedException ex) { Logger.getLogger(HelloJava.class.getName()).log(Level.SEVERE, null, ex); } t2.start(); System.out.println("main thread end!"); } }
輸出:線程
main thread start! a: 0 a: 1 a: 2 a: 3 main thread end! b: 0 b: 1 b: 2 b: 3
t1運行結束後,t2和main線程才繼續運行。注意,只要線程調用join()了,設不設daemon都不影響。code
##daemonget
package hellojava; import java.util.logging.Level; import java.util.logging.Logger; public class HelloJava { static class TestTask implements Runnable { private String taskName; public TestTask(String taskName) { this.taskName = taskName; } @Override public void run() { for (int i=0; i<4; i++) { System.out.println(taskName + ": " + i); try { Thread.sleep(1*1000); } catch (InterruptedException ex) { Logger.getLogger(HelloJava.class.getName()).log(Level.SEVERE, null, ex); } } } } public static void main(String[] args){ System.out.println("main thread start!"); Thread t1 = new Thread(new HelloJava.TestTask("a")); Thread t2 = new Thread(new HelloJava.TestTask("b")); t1.setDaemon(true); t2.setDaemon(true); t1.start(); t2.start(); try { Thread.sleep(2*1000); } catch (InterruptedException ex) { Logger.getLogger(HelloJava.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("main thread end!"); } }
輸出:it
main thread start! a: 0 b: 0 a: 1 b: 1 main thread end! b: 2 a: 2
設置daemon後,main線程結束後,daemon線程自動結束並釋放。io
下面是關於daemon的兩個討論,值得一看:class