吃饭也要看的守护线程,线程七大状态教学(内含零基础入门教学)

关于线程的零基础入门教学

如果不了解的话没关系,可以先看进行学习

入门级线程教学

守护线程

正常来说,我们主线程创建了一个子线程,我们主线程的运行和子线程是互不影响的,其中一个线程的停止运行并不会影响另外的线程运行

如果我们希望可以有一种方法,使一个线程结束运行了之后可以让另外一个线程也结束运行,这就是守护线程(一般是为工作线程服务对的,当所有的用户线程结束,守护线程自动结束)

我们来通过一个例子来看守护线程的实现

public class ThreadMethod03 {
    public static void main(String[] args) throws InterruptedException {
         MyDaemonThread myDaemonThread = new MyDaemonThread();
         myDaemonThread.start();

         for (int i=1;i<=10;i++){
             System.out.println("小翼鸣正在辛苦的工作......");
             Thread.sleep(1000);
         }
    }
}

class MyDaemonThread extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("小妹和小帅在快乐的聊天");
        }
    }
}

在上述代码中,我们运行的话两个线程会交替运行,因为子线程是不退出循环的所以会一直运行下去,我们通过改写成守护线程来使它在主线程退出的时候也结束运行

方法如下

        //如果我们希望当main线程结束后,子线程自动结束
        //只需要将子线程设为守护线程即可
        myDaemonThread.setDaemon(true);

我们来看完整代码

public class ThreadMethod03 {
    public static void main(String[] args) throws InterruptedException {
         MyDaemonThread myDaemonThread = new MyDaemonThread();
        //如果我们希望当main线程结束后,子线程自动结束
        //只需要将子线程设为守护线程即可
        myDaemonThread.setDaemon(true);
         myDaemonThread.start();
         for (int i=1;i<=10;i++){
             System.out.println("小翼鸣正在辛苦的工作......");
             Thread.sleep(1000);
         }
    }
}

class MyDaemonThread extends Thread {
    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("小妹和小帅在快乐的聊天");
        }
    }
}

运行结果

线程的生命周期

  • JDK中用Thread.State枚举表示了线程的几种状态

 官方给出六种状态

 实际上有七种状态(Runnable可以细分两种)

我们再通过一个流程图来好好分析

 创建一个线程New,一旦调用了start()方法,就会进入Runnable中的可运行状态,里面又细化出两个状态ready就绪状态running运行状态

我们再往下看

如果线程处于运行状态之后结束运行,那就进入terminated状态结束运行

如果在Runnable的状态下分别调用了不同的方法,那可能又会进入不同在状态(三条路径),然后再重新进入running状态,然后有可能进入ready有可能进入running。

也就是说 

Runnable状态代表可以运行,但是不一定马上running,是否真正地运行要取决于线程调度器(内核调度器),这个不是程序控制的。

我们也可以在图上Runnable中看到当调用了yield方法,实际上是从Running进入了ready状态,是否进入running由内核调度决定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值