「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
线程的五大状态
创建、就绪、运行、阻塞、死亡
线程 new Thread() 一旦创建就进入新生状态
当调用start方法,线程立即进入就绪状态,但并不意味着立即调度执行,进入运行状态线程才正真的执行线程体中的代码块
当调用sleep、wait或者线程锁定的时候,线程就进入可阻塞状态,就是代码不往下执行,等待锁解除后代码进入就绪状态然后等待cpu调度执行
线程中断或者结束一旦进入死亡状态就不会再次启动
停止线程
-
不推荐使用JDK提供的stop()、destory()方法
-
推荐线程自己停下来
-
建议使用一个标志位进行终止变量,当 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("线程该停止了");
}
}
}
}
复制代码
运行结果
线程休眠
sleep(时间)指定当前线程阻塞的毫秒数
sleep()的时间达到后线程进入就绪状态
sleep()方法会抛出java.lang.InterruptedException,使用时要进行处理
每一个对象都会有一个锁,sleep不会释放锁
之前一个创建线程的文章juejin.cn/post/702674… 里面的抢票的demo在模拟网络延时的时候就使用了线程休眠
sleep() 和 wait() 的区别
-
锁的释放不同:sleep() 休眠是抱着锁睡的不会释放锁
-
使用范围不同:wait必须在同步代码块中使用,sleep可以在任何地方睡
-
是否需要捕获异常:sleep需要去捕获异常, wait不需要捕获
-
来自不同的类 Object --> wait Thread --> sleep




近期评论