操作系统里的线程,自身是有一个状态的但是 Java 中,Thread 是对系统线程的封装,把这里的状态又进一步的精细化了!!一起来看看吧,看看你都了解多少~~
线程的状态主要分为以下6种:1)NEW 2)RUNNABLE 3)TIMED_WATING 4)WATING 5)BLOCKED 6)TERMINATED
下面来做具体讲解:
1)NEW
当用Thread类实例化一个对象的时候:
Thread t1 = new Thread(()->{});
此时仅仅是有了线程实例对象,但还并没有调用start()真正在操作系统里开启一个线程,所以是NEW状态.
2)RUNNABLE
即就绪态.何为就绪态?分2种:1.该线程正在被cpu核心执行
2.该线程处于等待被cpu调度的状态,但已经做好了随时可以执行的准备.
3)TIMED_WATING
是线程的阻塞态.
此状态特指:调用sleep()方法时,该线程所处的状态.
如果该线程正处于睡眠状态,也就是正在执行sleep ()那么该线程的状态就是TIMED WATING.
public class Threaddemo1 {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
while(true){
try {
Thread.sleep(1000); //sleep的时间几乎占据了t1的整个线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread.sleep(1000); //保证 t1线程已经开始执行
System.out.println(t1.getState());
}
}
结果:
4)WATING
是线程的阻塞态.
此处针对join()和wait()而言:
1)wait:比如t1调用wait 0后就陷入了WATING.一直得到其他线程针对同一把锁调用notify 0 才能将其唤醒为RUNNABLE.
2)join():使用join时也会出现WATING,比如t1等待t2,那么此时t1就是WATING状态.
5)BLOCKED
是线程阻塞态.
此处特指:等待锁的状态.(synchronized).
比如t1和t2竞争同一把锁,t1先拿到锁,此时t2就处于等待锁的状态.
public class Method {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
synchronized (Method.class){
while(true){
}
}
});
Thread t2 = new Thread(()->{
synchronized (Method.class){
System.out.println(1);
}
});
t1.start();
Thread.sleep(1000); //保证t1先拿到锁
t2.start();
Thread.sleep(1000); //保证t2进入了等待锁的状态
System.out.println("t2:"+t2.getState());
}
}
结果:
6)TEMINATED
此状态表示:当前线程已经被执行完了.
此时用 "该线程所对应的Thread类实例 "调用 "获取线程状态方法getState()",就会得到TERMINATED状态.
这里给一个大概的图示:
以上就是本节所有内容,uu们加油呀!!!