多线程-线程状态
常见的线程状态有六种:
1.新建状态(new):当我们new 了一个线程,但是没有调用start()方法;
2.Runnable状态:此状态包含两个状态:
- 就绪状态(Ready):当线程调用了start()方法时,线程就进入了就绪状态;
- 运行状态(Running):当该线程被系统的调度器选中就会进入运行状态;
3.结束状态(Taminate):如果不出意外,当线程执行完毕以后就会进入死亡状态,也就是结束状态;
4.(Timed_Waiting)按照时间等待:在运行过程中如果调用以下方法就会进入按时间等待的状态:
- LockSupport.parkNanos
- LockSupport.parkUntil
- Thread.sleep(time)
- o.wait(time)
- t.join(time)
5.(Wating)等待: 在运行过程中,如果调用以下方法就会进入Waiting状态:
- o.wait()
- t.join()
- LockSupport.park()
当调用以下方法就会回到Running状态:
- o.notify() / notifyAll()
- LockSupport.park()
6.阻塞状态(Blocked):在同步代码块的情况下,如果线程没有获得锁,就会进入阻塞状态;
下面是线程状态的简图:
话不多说直接上代码:
package com.example.demo.threaddemo.juc_001;
/**
* 线程的状态有6种状态:
* 1、当我们创建一个线程时,还没有调用start()方法时,此时该线程处于新建状态;
*
* 2、线程调用start()方法时,他会被线程调度器来执行,也就是交给操作系统来执行,操作系统执行时整个状态称为
* Runnable ,Runnable内部又分为两个状态: ready(就绪状态) running(运行状态)
* ****等到调用yield() 方法时,线程回到等待队列,处于就绪状态,等到线程调度器选中又进入running状态
* (1)就绪状态就是扔到CPU的等待队列中去,等待CPU的执行;
* (2)等真正扔到CPU上去执行的时候,才叫做running状态;
*
* 3、如果线程顺利执行完了,就进入了Teminated(结束状态)
* 在runnable这个状态中还会出现其他状态的变迁,例如TimeWating 、Wating 、Blocked;
*
* 4、在同步代码块的情况下没获得锁就会进入阻塞状态,获得锁就会进入运行状态;
*
* 5、在运行的过程中如果调用了 o.wait() 、t.join() 、LockSupport.park()方法进入Waiting状态 ,调用o.notify()
* notifyAll() 、 LockSupport.unpark()方法又会回到running状态;
*
* 6、TimeWating是按照时间等待,时间结束以后自己就回去了,Thread.sleep(time)、 o.wait(time)、 t.join(time)、
* LockSupport.parkNanos()、LockSupport.parkUntil()
*/
public class Thread_State {
public static class MyThread extends Thread{
@Override
public void run() {
System.out.println("A开始-------------"+ this.getState());
for (int i = 0; i < 20; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
System.out.println("new MyThread"+ myThread.getState());
myThread.start();
try {
myThread.sleep(3000);
System.out.println("myThread.sleep()"+ myThread.getState());
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
myThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(myThread.getState());
}
}
}

![多线程-线程状态
[编程语言教程]](https://www.zixueka.com/wp-content/uploads/2024/02/1706717586-946820ad97efb34.jpg)

