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("线程该停止了");
}
}
}
}