[Java] 用户线程和守护线程

        java线程可以分为两种:用户线程额守护线程。用户线程有时称为前台线程。我们在写程序时,把一些耗时的处理从主线程里面拿出来,放到单独的一个线程里面去执行,以免阻止主线程的运行,造成界面处于一种无响应状态,无法进行其他操作,这样的用户体验非常不好。一般我们在程序里面创建的线程都是用户线程,它们为程序所用,这些线程都必须正常的运行到结束,或者按照要求终止。

        守护线程有时称为后台线程。我们在程序里面一般很少创建后台线程,它一般由JVM创建,默默的运行在后台,为系统或我们的程序提供一些服务。比如,定时检测对象的使用情况,计算一些对象的引用,在必要的时候执行一些对象的销毁和资源的回收。我们的程序一般不用去管它。

        用户线程和守护线程在本质上其实没有太大的区别,只是应用场景不太一样。创建线程时,执行setDaemon(true),这样线程就成为了守护线程,一定要在线程启动前进行设置,否则后出现异常。另外,在守护线程里面创建的线程自动为守护线程,在用户线程里面创建的线程自动为用户线程。还有一点,就是只要有一个用户线程没有执行完,JVM都不会自动退出。但是,当所有的用户线程都运行完毕后,JVM就会自动退出,如果现在还有守护线程在运行,它们就会被立刻全部终止。换句话说,不能保证守护线程能运行完毕,当用户线程全部结束后,守护线程就会被JVM无情的终止掉。所以使用守护线程时要注意这一点。

一个简单的示例:

public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable(){
			@Override
			public void run() {
				for (int i = 0; i < 5; i++) {
					System.out.println("用户线程地" + i + "执行!");
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}});
		
		Thread t2 = new Thread(new Runnable(){
			@Override
			public void run() {
				for (int i = 0; i < 50; i++) {
					System.out.println("守护线程地" + i + "执行!");
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}});
		t2.setDaemon(true);
		
		t1.start();
		t2.start();
	}


下面是运行结果:

用户线程地0执行!
守护线程地0执行!
守护线程地1执行!
用户线程地1执行!
守护线程地2执行!
用户线程地2执行!
守护线程地3执行!
用户线程地3执行!
守护线程地4执行!
用户线程地4执行!
守护线程地5执行!

如文章有错误之处,敬请提出,共同讨论!

你可能感兴趣的:(Java线程)