Java 线程的几种状态
今天这篇文章单独说一下Java线程的几种状态
1.新建(New)
这时线程首先时被创建出来,就像我们写的代码:
Thread thread = new Thread()
这是会给这个线程分配内存空间,但还没有被操作系统调度,也不会执行run()方法.
2.可运行(Runnable)
由创建到可运行状态时,在代码中的体现是这样:
thread.start()
也就是调用了start()方法.处于这个状态的线程,会被放到可运行的线程队列中,等待CPU资源分配,一旦获得CPU时间片,线程就会开始执行run方法中的代码,但需要的是,可运行状态包括了操作系统线程状态中的就绪和运行两种情况.在Java里统一归为Runnable状态.
3.阻塞(Block)
举个例子,当用synchronized修饰代码块的时候,两个线程都要拿这个锁,当一个线程拿到锁之后,另一个线程就会陷入阻塞状态,就是产生了锁竞争,这个时候线程就会进入阻塞状态,当线程获取到锁之后又会变成可运行状态.
4.等待(Wating)
当线程调用wait这个方法的时候,需要其他线程显示将其唤醒比如notify()这个方法或者notifyAll()这个方法.当然让线程处于等待状态不仅这一种方法,还有其他的方法,就比如join()方法,简介的代码案例就像下面
Thread t = new Thread(() -> { /* 任务代码 */ });
t.start();
t.join(); // 当前线程等待t执行完毕
这里要注意t.join()这个虽然是由目标调用,但是用来阻塞执行这个函数的.可以创建两个线程,在main方法中让一个线程调用join这个方法,直到这个线程执行完毕之后,主线程才会继续向下执行,这里其实就是让主线程进入了等待状态,这个也要明白就是当主线程被唤醒后,就是转换成了可执行状态.
5.超时等待
这里的超时等待,其实就是给等待加上等待时间,等过了这个时间就会自动被唤醒,进入就绪状态,就是前面说的可执行状态,会抢占式执行.当让,也可以被其他线程主动唤醒.
6.终止
线程执行完 run
方法中的所有代码,或者因为出现未捕获的异常而异常终止,此时线程处于终止状态,生命周期结束,无法再被调度执行。无法切换到其他状态.