Java 多线程学习笔记十一(线程停止)

内容来自B站【狂神说Java】多线程详解

一、线程五大状态

1. 定义:

(1). 创建状态:启动线程后进入就绪状态。
(2). 就绪状态:获得CPU资源后进入运行状态。
(3). 阻塞状态:阻塞解除后进入就绪状态。
(4). 运行状态
- 等待用户输入或线程休眠后进入阻塞状态
- 释放CPU资源后进入就绪状态
- 线程自然执行完毕或外部干涉终止线程后进入死亡状态
(5). 死亡状态

2. 详细的解释

(1). Thread t = new Thread();线程对象一旦创建就进入到了新生(创建)状态。
(2). 当调用start()方法,线程立即进入就绪状态,但不意味着立即调度执行。
(3). 当获取到资源进入运行状态后,线程才真正执行线程体的代码块。
(4). 当调用sleep、wait或同步锁定时,线程进入阻塞状态,就是代码不往下执行,阻塞事件解除后,重新进入就绪状态,等待CPU调度执行。
(5). 线程中断或者结束,进入死亡状态,一旦进入死亡状态,就不能再次启动。

3. 线程方法

方法 说明
public final void setPriority(int newPriority) 更改线程的优先级
public static native void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠
public final void join() 等待该线程终止
public static native void yield() 暂停当前正在执行的线程对象,并执行其他线程
public void interrupt() 中断线程,别用这个方式
public final native boolean isAlive() 测试线程是否处于活动状态

4. 停止线程

(1). 不推荐使用JDK提供的stop()、destroy()方法。(已废弃)
(2). 推荐线程自己停止下来。
(3). 建议使用一个标志位进行终止变量,当 flag == false,则终止线程运行。

5. 代码演示

package com.example.demo.state;

public class TestStop implements Runnable {

    // 1. 设置一个标志位
    private boolean flag = true;

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

    // 2. 设置一个公开的方法停止线程,转换标志位
    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("main --> " + i);
            if (i == 900) {
                // 调用stop方法
                testStop.stop();
                System.out.println("线程该停止了");
            }
        }
    }
}

posted @ 2021-12-27 22:57  君子键  阅读(45)  评论(0)    收藏  举报