public final void setDaemon(boolean on)
守护线程(后台线程)
setDaemon(boolean on):将该线程标记为守护线程或者用户线程。当主线程结束,守
护线程自动结束, 当正在运行的线程都是守护线程时,java 虚拟机jvm 退出, 该方法必须在
启动线程前调用;
守护线程的特点:
守护线程开启后和前台线程共同抢夺cpu 的执行权,开启、运行两者都没区别,
但结束时有区别,当所有前台线程都结束后,守护线程会自动结束。
Deamon //守护线程,标记。如果进程中运行的线程都是守护线程,该进程终止了。
package java.thread;
import java.util.Date;
/**
* 守护线程:Deamon
*/
public class TreadDeamonDemo {
public static void main(String[] args) {
KTV k1 = new KTV("r1", 5);
KTV k2 = new KTV("r1", 8);
Waiter w = new Waiter("");
//守护线程
w.setDaemon(true);
k1.start();
k2.start();
w.start();
}
}
/**
* KTV包箱
*/
class KTV extends Thread {
private String name0;
private int sleep;
public String getName0() {
return name0;
}
public void setName0(String name0) {
this.name0 = name0;
}
public int getSleep() {
return sleep;
}
public void setSleep(int sleep) {
this.sleep = sleep;
}
public KTV(String name0, int sleep) {
this.name0 = name0;
this.sleep = sleep;
}
@Override
public void run() {
try {
System.out.println(name0 + "开始营业了");
Thread.sleep(sleep * 1000);
System.out.println(name0 + "号包厢买单了" + "耗时" + sleep + "秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 服务员
*/
class Waiter extends Thread {
private String name0;
private int sleep;
public String getName0() {
return name0;
}
public void setName0(String name0) {
this.name0 = name0;
}
public Waiter(String name0) {
this.name0 = name0;
}
@Override
public void run() {
while(true){
System.out.println(new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
注意:一般把守护线程做成死循环,如果进程中运行的线程都是守护线程,该进程终止了。
模拟结果:
r1开始营业了
r1开始营业了
Sat Jul 29 11:48:54 CST 2017
Sat Jul 29 11:48:55 CST 2017
Sat Jul 29 11:48:56 CST 2017
Sat Jul 29 11:48:57 CST 2017
Sat Jul 29 11:48:58 CST 2017
r1号包厢买单了耗时5秒
Sat Jul 29 11:48:59 CST 2017
Sat Jul 29 11:49:00 CST 2017
Sat Jul 29 11:49:01 CST 2017
r1号包厢买单了耗时8秒
Process finished with exit code 0