package com.wyl.shouhuxiancheng;
/****
* 守护线程
*
* 需求:较短线程负责读学生那个文件到学生表,读完后往标志表插入一条数据,说我读完了。 耗时20s
* 较长线程负责读取班级那个文件到 班级表,读完后往标志表插入一条数据,说我读完了。 耗时80s
* main方法的线程只负责在70s的时候打印日志
*
* 守护线程负责读取标志表的两条标志,一条是学生的完成标志,一条是班级的完成标志,如果两条标志都存在,
* 则将班级表关联到学生表,关联查询来展示到页面
*
* @author 13641900178
*
*/
class DaemonThread implements Runnable{
int i=0;
public void run() {
while(true){
i++;
processSomething( i);
}
}
private void processSomething(int i) {
try {
System.out.println("我是守护线程,我是第"+i+"次执行>>>"+ShouHuXianCheng.userFlag+" ---"+ShouHuXianCheng.classFlag);
if(ShouHuXianCheng.userFlag.equals("1")&&ShouHuXianCheng.classFlag.equals("1")){
Thread.sleep(25000);
System.out.println("yes I do,I am over");
ShouHuXianCheng.chaxFlag="1";
}
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class ShouHuXianCheng {
public static String userFlag="0";
public static String classFlag="0";
public static String chaxFlag="0";
public static void main(String[] args) throws InterruptedException {
Thread dt = new Thread(new DaemonThread(), "dt");
dt.setDaemon(true);// 译者注:此次将User线程变为Daemon线程
dt.start();
// continue program
ShouHuXianCheng sx=new ShouHuXianCheng();
sx.test();
sx.test11();
Thread.sleep(30000);
System.out.println("我是主线程结束了 mygod");
}
public void test(){
Thread t=new Thread(new Runnable() {
public void run() {
for(int i=0;i<2;i++){
try {
Thread.sleep(20000);
System.out.print("我是较短那个用户线程");
System.out.println("睡20s"+"我是第"+(i+1)+"次睡觉---");
if(i==1){
userFlag="1";
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t.start();
}
public void test11(){
Thread t=new Thread(new Runnable() {
public void run() {
for(int i=0;i<8;i++){
try {
Thread.sleep(10000);
System.out.print("----我是最长那个用户线程");
System.out.println("睡10s"+"我是第"+(i+1)+"次睡觉");
if(i==7){
classFlag="1";
//等待守护线程执行完成,改变标志后,我才结束
//如果没有该段代码,这个线程执行完成后,守护线程马上就断了,是不会执行最后一次的,这个要理解
while(ShouHuXianCheng.chaxFlag.equals("0")){
Thread.sleep(10000);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
t.start();
}
}
执行结果如下:
我是守护线程,我是第1次执行>>>0 ---0
我是守护线程,我是第2次执行>>>0 ---0
----我是最长那个用户线程睡10s我是第1次睡觉
我是较短那个用户线程睡20s我是第1次睡觉---
我是守护线程,我是第3次执行>>>0 ---0
----我是最长那个用户线程睡10s我是第2次睡觉
我是主线程结束了 mygod
我是守护线程,我是第4次执行>>>0 ---0
----我是最长那个用户线程睡10s我是第3次睡觉
我是较短那个用户线程睡20s我是第2次睡觉---
我是守护线程,我是第5次执行>>>1 ---0
----我是最长那个用户线程睡10s我是第4次睡觉
我是守护线程,我是第6次执行>>>1 ---0
----我是最长那个用户线程睡10s我是第5次睡觉
我是守护线程,我是第7次执行>>>1 ---0
----我是最长那个用户线程睡10s我是第6次睡觉
我是守护线程,我是第8次执行>>>1 ---0
----我是最长那个用户线程睡10s我是第7次睡觉
我是守护线程,我是第9次执行>>>1 ---0
----我是最长那个用户线程睡10s我是第8次睡觉
我是守护线程,我是第10次执行>>>1 ---1
yes I do,I am over
我想说几点:
1 main函数是特殊用户线程,main函数结束,如果还有其他用户线程在执行中,守护线程不结束
2 当有用户线程存在时,守护线程存在,否则守护线程随着最后一个用户线程的结束马上结束
3 不管是守护线程还是用户线程,都存存在于进程中,不能独立于进程之外