一、线程状态
操作系统中,线程被视为轻量级的进程,因此操作系统的线程状态与操作系统的进程状态是一致的
1. 线程五大状态
-
创建状态
Thread t = new Thread()
线程对象一旦创建就进入到了新生状态 -
就绪状态
当调用
start()
方法,线程会进入就绪状态,但不意味着立即执行 -
运行状态
进入运行状态,线程才会真正去执行线程体的代码
-
阻塞状态
当调用
sleep()
、wait()
或同步锁定时,线程进入阻塞状态,代码不会继续执行。等待阻塞事件解除后,重新进入就绪状态,等待CPU调度执行 -
死亡状态
线程中断或结束,一旦进入死亡状态就不能再启动
2. 线程中的一些方法
setPriority(int newPriority)
更改线程的优先级static void sleep(long millis)
在指定的毫秒数内让当前执行的线程休眠void join()
合并线程并等待该线程终止再执行其他线程static void yield()
暂停当前正在执行的线程,并执行其他线程void interrupt()
中断线程(尽量别用)boolean isAlive()
测试线程是否处于活动状态
二、操控线程
1. 停止线程
1.1 要点
- 不推荐使用 JDK 提供的
stop()
、destory()
等方法 - 推荐等待线程自己停止,例如使用
for
循环限制次数,不建议死循环 - 建议使用一个标志位终止变量,例如当
flag == false
时,终止线程运行
1.2 示例
public class TestStop implements Runnable {
// 1. 定义标识
private static boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag) {
System.out.println("run......Thread " + i++);
if (i >= 30) {
TestStop.stop();
System.out.println("该线程已停止");
}
}
}
// 2. 对外提供方法改变标识
public static void stop() {
flag = false;
}
public static void main(String[] args) {
TestStop t = new TestStop();
new Thread(t).start();
for (int i = 0; i < 100; i++) {
System.out.