线程状态
线程状态概述
- 线程创建并启动,既不是一启动就进入执行状态,也不是一直处于执行状态
- API java.lang.Thread.State 枚举类给出六种线程状态
三个比较重要的状态
Timed Waiting(计时等待)
- Timed Waiting在API描述为:一个正在限时等待另一个线程执行一个唤醒动作的线程处于这一状态
- 上一篇文章 Java 多线程之线程安全-2我写过一个卖票的Demo
- 在run方法中添加了Sleep语句,这样就强制当前正在执行的线程休眠(暂停执行),以减慢线程
- 其实当我们调用sleep方法后,线程就进入休眠状态,也就是所谓的Timed Waiting计时等待
public class MyThread implements Runnable{
@Override
public void run(){
for(int i=0;i<100;i++){
if(i%10 == 0){
System.out.println("------" + i);
}
System.out.println(i);
try{
Thread.sleep(1000);
SYstem.out.println(" 线程睡眠1秒! \n");
}catch(Exception e){
e.printStackTrace();
}
}
}
}
!!! 秒表案列可以发现,sleep方法使用很简单,但要记住几点…
- 进入计时等待状态是一种常见情形是调用sleep方法,单独的线程可以调用,不一定非要有协作关系
- 为了让其他线程有机会执行,可以将Thread.sleep调用放在 线程run()之内,这样才能保证该线程执行过程中休眠
- sleep与锁无关,线程睡眠到自动苏醒,并返回至runnable(可运行)阶段
Blocked (锁阻塞)
- Blocked状态API的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态
- 学完同步机制,那么这个状态非常好理解,线程A与线程B代码中使用同一锁,如果线程A获取到锁,线程A进入到Runnable状态,那么线程B就进入阻塞状态
Waiting(无线等待)
- Wating状态为API介绍为,一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状
- Object类中有如下方法
!!!举个栗子,下图所示!!!
!!!上代码(模拟生产者跟消费者的案列)!!!
public class Demo01WaitAndNotify {
public static void main(String[] args) {
Object obj = new Object();
Random random = new Random();
new Thread("Thread-顾客") {
@Override
public void run() {
while (true) {
// 保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized (obj) {
int num = random.nextInt(99);
System.out.println(Thread.currentThread().getName() + num + ":" + "告知老板要的包子种类和数量");
// 调用wait()方法进入等待状态
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + num + ":" + "开始吃包子");
System.out.println("--------------------------");
System.out.println("--------------------------");
}
}
}
}.start();
new Thread("Thread-老板") {
@Override
public void run() {
while (true) {
try {
// 睡眠5秒
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println(Thread.currentThread().getName() + ":" + "包子做好了");
// 唤醒消费者
obj.notify();
}
}
}
}.start();
}
}
!!!结果!!!
!!!这里注意一下notify() 和 notifyAll() 方法的区别!!!