線程可以是守護線程或用戶線程。
守護線程是服務(wù)提供者線程。
當JVM檢測到應(yīng)用程序中的所有線程都只是守護線程時,它將退出應(yīng)用程序。
我們可以通過使用setDaemon()方法通過傳遞true作為參數(shù),使線程成為一個守護線程。
我們必須在啟動線程之前調(diào)用一個線程的setDaemon()方法。否則,一個java.lang。拋出IllegalThreadStateException。
我們可以使用isDaemon()方法來檢查線程是否是守護線程。
創(chuàng)建線程時,其守護程序?qū)傩耘c創(chuàng)建線程的線程相同。
以下代碼創(chuàng)建一個線程并將線程設(shè)置為守護線程。
public class Main { public static void main(String[] args) { Thread t = new Thread(Main::print); t.setDaemon(true); t.start(); System.out.println("Exiting main method"); } public static void print() { int counter = 1; while (true) { try { System.out.println("Counter:" + counter++); Thread.sleep(2000); // sleep for 2 seconds } catch (InterruptedException e) { e.printStackTrace(); } } } }
上面的代碼生成以下結(jié)果。
以下代碼將線程設(shè)置為非守護線程。由于這個程序有一個非守護線程,JVM將繼續(xù)運行應(yīng)用程序,即使在main()方法完成后。
您必須強制停止此應(yīng)用程序,因為線程在無限循環(huán)中運行。
public class Main { public static void main(String[] args) { Thread t = new Thread(Main::print); t.setDaemon(false); t.start(); System.out.println("Exiting main method"); } public static void print() { int counter = 1; while (true) { try { System.out.println("Counter:" + counter++); Thread.sleep(2000); // sleep for 2 seconds } catch (InterruptedException e) { e.printStackTrace(); } } } }
上面的代碼生成以下結(jié)果。
更多建議: