您的位置:首页 > 编程语言 > Java开发

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

2012-10-21 19:04 706 查看
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执行!

如文章有错误之处,敬请提出,共同讨论!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: