【多线程学习】线程停止、休眠

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

线程的五大状态

创建、就绪、运行、阻塞、死亡

image.png

线程 new Thread() 一旦创建就进入新生状态

当调用start方法,线程立即进入就绪状态,但并不意味着立即调度执行,进入运行状态线程才正真的执行线程体中的代码块

当调用sleep、wait或者线程锁定的时候,线程就进入可阻塞状态,就是代码不往下执行,等待锁解除后代码进入就绪状态然后等待cpu调度执行

线程中断或者结束一旦进入死亡状态就不会再次启动

停止线程

  1. 不推荐使用JDK提供的stop()、destory()方法

  2. 推荐线程自己停下来

  3. 建议使用一个标志位进行终止变量,当 flag = false 时则终止线程运行

实现一个停止线程的demo

public class TestStop implements Runnable {

    //设置一个标志位
    private Boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while (flag) {
            System.out.println("Thread run..." + i++);
        }
    }

    //设置一个公开的方法停止线程
    public void stop() {
        this.flag = false;
    }

    public static void main(String[] args) {
        TestStop testStop = new TestStop();
        new Thread(testStop).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("主线程" + i);
            if (i == 999) {
                //调用stop方法切换标志位
                testStop.stop();
                System.out.println("线程该停止了");
            }
        }
    }
}
复制代码

运行结果

image.png

线程休眠

sleep(时间)指定当前线程阻塞的毫秒数

sleep()的时间达到后线程进入就绪状态

sleep()方法会抛出java.lang.InterruptedException,使用时要进行处理

每一个对象都会有一个锁,sleep不会释放锁

之前一个创建线程的文章juejin.cn/post/702674… 里面的抢票的demo在模拟网络延时的时候就使用了线程休眠

image.png

sleep() 和 wait() 的区别

  1. 锁的释放不同:sleep() 休眠是抱着锁睡的不会释放锁

  2. 使用范围不同:wait必须在同步代码块中使用,sleep可以在任何地方睡

  3. 是否需要捕获异常:sleep需要去捕获异常, wait不需要捕获

  4. 来自不同的类 Object --> wait Thread --> sleep