JAVA-线程系列教程【5】 守护线程和用户线程

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 不管是守护线程还是用户线程,都存存在于进程中,不能独立于进程之外 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 中的线程分为守护线程用户线程两种类型,二者的区别在于它们对程序终止的影响不同。当所有的用户线程结束时,程序会停止运行,而守护线程则会随之自动关闭。 下面是一个 Java 守护线程用户线程的示例: ```java public class DaemonThreadExample { public static void main(String[] args) { Thread user = new Thread(() -> { for (int i = 0; i < 5; i++) { System.out.println("User thread is running " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); user.start(); Thread daemon = new Thread(() -> { while (true) { System.out.println("Daemon thread is running"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }); daemon.setDaemon(true); daemon.start(); System.out.println("Main thread ends"); } } ``` 在这个示例中,我们创建了一个名为 `user` 的线程对象,并在它的执行体中使用 `for` 循环打印一条信息并暂停一秒钟。然后我们创建了一个名为 `daemon` 的线程对象,并将其设置为守护线程。在它的执行体中,我们使用 `while` 循环打印一条信息并暂停一秒钟。最后我们启动这两个线程,并打印一条信息。 运行这个示例,我们可以看到,当用户线程执行完毕后,程序终止并输出 `Main thread ends`,而守护线程则会随之自动关闭。 总的来说,守护线程适用于支持其他线程的运行,但又不需要独立运行的场景;而用户线程则是程序的主要执行体,它们在程序运行期间承担着各种任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知乎关注八戒来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值