Java守护线程和用户线程

1.守护线程是一种特殊的线程,它属于是一种陪伴线程。
2. java 中有两种线程:用户线程和守护线程
3.可以通过 isDaemon() 方法来区别它们:如果返回 false ,则说明该线程是“用户线程”;否则就是“守护线程”。
4.典型的守护线程就是垃圾回收线程。只要当前JVM进程中存在任何一个非守护线程没有结束,守护线程就在工作;只有当所以非守护线程结束时,守护线程才会随着JVM一同停止工作。
主线程main是用户线程

public class TestThread4 {
    public static void main(String[] args) {
        //1.不是守护线程是用户定义的线程
        //当我们的用户线程存在就工作,用户线程不存在则停止,来守护用户线程
        //System.out.println(Thread.currentThread().isDaemon());

        //线程A
        Thread threadA = new Thread(new DaemonRunnable(),"子线程A");
        // 设置线程A为守护线程,此语句必须在start方法之前执行
        //没有的话程序一直进行
        threadA.setDaemon(true);
        threadA.start();

        //线程B用户线程
        Thread threadB = new Thread(new DaemonRunnable(),"子线程B");
        threadB.start();

        //主线程
        try {
            Thread.sleep(3000);
        // 中断用户线程
            threadB.interrupt();
            //main为用户线程,此时未结束,所有用户线程都结束后 守护线程结束
            Thread.sleep(3000);//如果没有这句话的话,就全部结束,如下例子            
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class DaemonRunnable implements Runnable{

    @Override
    public void run() {
        int i=0;
        try{
        while(true){
            System.out.println(Thread.currentThread().getName()+"调用第"+ ++i+"次");
            Thread.sleep(1000);
        }
        }catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName()+"中断");
        }
    }
}
子线程A调用第1次
子线程B调用第1次
子线程A调用第2次
子线程B调用第2次
子线程B调用第3次
子线程A调用第3次
子线程B中断
子线程A调用第4次
子线程A调用第5次
子线程A调用第6

和上面的形成对比

class MyThread implements Runnable {3秒后b退出
  @Override
    public void run() {
       while(true){
           System.out.println(Thread.currentThread().getName()+"当前线程是否为守护线程"+Thread.currentThread().isDaemon());
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               System.out.println(Thread.currentThread().getName()+"线程退出");
               return;
           }
       }
    }
}

public class Thread2 {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        Thread tHread1 = new Thread(myThread, "" + "子线程A");
        tHread1.setDaemon(true);
        //用户线程
        Thread tHread2 = new Thread(myThread, "" + "子线程B");
        tHread1.start();
        tHread2.start();

        Thread.sleep(3000);
        tHread2.interrupt();
    }
}

子线程A当前线程是否为守护线程true
子线程B当前线程是否为守护线程false
子线程A当前线程是否为守护线程true
子线程B当前线程是否为守护线程false
子线程A当前线程是否为守护线程true
子线程B当前线程是否为守护线程false
子线程B线程退出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值