守护线程(即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!"); } }
结果对比
用户线程中会一直执行下去,守护线程执行一会就结束了。
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 次执行