基本概念
- 守护线程:和主线程一起结束的线程,叫守护线程。
- 非守护线程:主线程的结束不影响线程的执行的线程,也叫用户线程。
示例代码
非守护线程:
public class MyThread extends Thread{ @Override public void run() { //重写run方法 for(int i=1;i<11;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:"+Thread.currentThread().getName()+"执行了"+i+"次"); } } public static void main(String[] args) { MyThread myThread=new MyThread(); myThread.start(); for(int i=1;i<11;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:"+Thread.currentThread().getName()+"执行了"+i+"次"); } } }
打印结果:由结果可以看出主线程的正常结束并不会影响子线程的执行,子线程继续执行
线程:main执行了1次
线程:Thread-0执行了1次
线程:Thread-0执行了2次
线程:main执行了2次
线程:main执行了3次
线程:main执行了4次
线程:main执行了5次
线程:main执行了6次
线程:Thread-0执行了3次
线程:main执行了7次
线程:Thread-0执行了4次
线程:main执行了8次
线程:Thread-0执行了5次
线程:main执行了9次
线程:Thread-0执行了6次
线程:main执行了10次
线程:Thread-0执行了7次
线程:Thread-0执行了8次
线程:Thread-0执行了9次
线程:Thread-0执行了10次
守护线程
public class MyThread extends Thread{ @Override public void run() { //重写run方法 for(int i=1;i<11;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:"+Thread.currentThread().getName()+"执行了"+i+"次"); } } public static void main(String[] args) { MyThread myThread=new MyThread(); myThread.setDaemon(true); myThread.start(); for(int i=1;i<6;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:"+Thread.currentThread().getName()+"执行了"+i+"次"); } } }
打印结果:由结果可以看出主线程结束后,设置为守护线程的子线程将不再执行。
线程:Thread-0执行了1次
线程:main执行了1次
线程:main执行了2次
线程:Thread-0执行了2次
线程:Thread-0执行了3次
线程:main执行了3次
线程:main执行了4次
线程:Thread-0执行了4次
线程:Thread-0执行了5次
线程:main执行了5次