黑马程序员技术交流社区
标题:
问题已经解决当所有的前台线程结束后,所有的后台线程...
[打印本页]
作者:
郑彬
时间:
2012-8-15 23:30
标题:
问题已经解决当所有的前台线程结束后,所有的后台线程...
本帖最后由 郑彬 于 2012-8-16 23:51 编辑
当所有的前台线程结束后,所有的后台线程(守护线程)会自动结束。
这句话怎么理解?
作者:
张忠豹
时间:
2012-8-16 00:27
/*
* 运行一下代码,你会发现,当把thread1设置为守护线程的时候,只要thread的for循环执行完成之后
* thread1的相关for循环就不会执行了(但是还没有执行完)。这就是守护线程的执行路程。
* 当程序中的所有用户线程都已结束运行时,即使守护线程run()中还有需要执行的语句,守护线程也不会再执行了
* 可以用守护线程做一些不是很严格的工作,即使随时结束不会产生不良的结果
* **/
class Daemon implements Runnable {
@Override
public void run() {
if (Thread.currentThread().getName().equals("非守护线程")) {
for (int i = 0; i < 15; i++) {
System.out.println(Thread.currentThread().getName() + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
}
if (Thread.currentThread().getName().equals("守护线程")) {
// int x =1;
for (int i = 0; i < 1500; i++) {
System.out.println(Thread.currentThread().getName() + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
}
}
}
public class ExampleDaemon {
public static void main(String args[]) {
Daemon daemon = new Daemon();
Thread thread = new Thread(daemon, "非守护线程");
Thread thread1 = new Thread(daemon, "守护线程");
thread1.setDaemon(true);// 设置为守护线程
thread.start();
thread1.start();
}
}
作者:
官文昌
时间:
2012-8-16 09:40
就是后台线程依赖于前台线程而存在,比如这里有两个线程,线程A和线程B,我们把线程B设为守护线程,当线程A运行结束后,线程B就马上自动结束,这就相当于这就像汽车没汽油了,汽车会自动停止一样~~(个人理解)
作者:
黑马振鹏
时间:
2012-8-16 10:39
这个问题之前论坛中有童鞋已经回答过了,陈冲童鞋,之前我自己也不是太明白,看了他举得例子,很经典。
http://bbs.itheima.com/thread-21348-1-1.html
我自己再仿写一个
class Daemon implements Runnable {
@Override
public void run() {
int i = 0;
while(true){
System.out.println("I am a Daemon Thread!"+(i++));
}
}
}
public class DaemonDemo {
public static void main(String[] args) {
Daemon d = new Daemon();
Thread t = new Thread(d);
for(int i =0;i<15;i++){
System.out.println("前台线程001");
}
//设置t为守护线程
t.setDaemon(true);
t.start();
for(int i =0;i<15;i++){
System.out.println("前台线程002");
}
}
}
复制代码
虽然我们定义了一个线程t是无限循环,但是把它设置为守护线程后,运行情况就会有变化,如果前台线程就是那两个for(){} over后,整个程序就结束,而不是无限循环。
这就是守护线程。
注意事项,直接看API:
setDaemon
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
该方法首先调用该线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException(在当前线程中)。
参数:
on - 如果为 true,则将该线程标记为守护线程。
作者:
孙鑫
时间:
2012-8-16 17:36
前台线程:是指接受后台线程服务的线程
后台线程:指为其他线程提供服务的线程
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。
主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。
作者:
郑彬
时间:
2012-8-16 23:51
问题已经解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2