線程分類
守護線程(即daemon thread),是個服務線程,准確地來說就是服務其他的線程,這是它的作用——而其他的線程只有一種,那就是用戶線程。所以java里線程分2種:
- 用戶線程:比如垃圾回收線程,就是最典型的守護線程
- 守護線程:就是應用程序里的自定義線程
用戶線程舉例
public class UserTest { public static void main(String[] args) { Thread daemonThread = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("hi daemon...."); } } }); daemonThread.start(); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main thread is over!"); } }
守護線程舉例
public class DaemonTest { public static void main(String[] args) { Thread daemonThread = new Thread(new Runnable() { @Override public void run() { while(true) { System.out.println("hi Daemon...."); } } }); daemonThread.setDaemon(true); daemonThread.start(); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("main thread is over!"); } }
結果對比
用戶線程中會一直執行下去,守護線程執行一會就結束了。
定義
1、守護線程,專門用於服務其他的線程,如果其他的線程(即用戶自定義線程)都執行完畢,連main線程也執行完畢,那么jvm就會退出(即停止運行)——此時,連jvm都停止運行了,守護線程當然也就停止執行了。
2、再換一種說法,如果有用戶自定義線程存在的話,jvm就不會退出——此時,守護線程也不能退出,也就是它還要運行,干嘛呢,就是為了執行垃圾回收的任務啊。
守護進程和用戶進程同時執行任務的例子
#
public class MyCommon extends Thread { public void run() { for (int i = 0; i < 5; ++i) { System.out.println("線程1第 " + i + " 次執行"); try { Thread.sleep(7); }catch (InterruptedException e) { e.printStackTrace(); } } } }
#
public class MyDaemon extends Thread { public void run() { for (int i = 0; i < 5000; ++i) { System.out.println("后台線程1第 " + i + " 次執行"); try { Thread.sleep(7); }catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { Thread thread1 = new MyCommon(); Thread thread2 = new MyDaemon(); thread2.setDaemon(true); thread1.start(); thread2.start(); } }
執行結果
后台線程1第 0 次執行 線程1第 0 次執行 后台線程1第 1 次執行 線程1第 1 次執行 后台線程1第 2 次執行 線程1第 2 次執行 后台線程1第 3 次執行 線程1第 3 次執行 后台線程1第 4 次執行 線程1第 4 次執行 后台線程1第 5 次執行