Java线程有六种状态
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
1.New
New状态指的是线程被声明出但是还没有调用start方法时的状态。
注:start方法可以被重复调用吗?
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
我们看下start方法的内部源码,可以看出threadStatus的值不为0的话,会抛出IllegalThreadStateException;经过打断点运行。发现第二次调用start方法时,threadstatus已经不为0。
2.RUNNABLE
我们看下官方API对RUNNABLE状态的解释。
/**
* Thread state for a runnable thread. A thread in the runnable
* state is executing in the Java virtual machine but it may
* be waiting for other resources from the operating system
* such as processor.
*/
我们可以看出RUNNABLE状态相当于操作系统线程中ready和running两个状态
3.BLOCKED状态
阻塞状态,处于阻塞状态的线程正在等待锁的释放。类似于食堂的排队买饭的情况。
4.WAITING状态
等待状态,等待状态的线程需要别的线程赖唤醒它。
要进入等待状态,可以使用下面的三个方法:
Object.wait();使线程处于等待状态直到别的线程来唤醒它,这个过程首先需要线程持有锁,然后执行方法以后会释放锁。
Thread.join();等待执行该方法的线程执行完,底层调用的是Object.wait方法
LockSupport.park();除非调度许可,否则禁止当前线程调度。
5.TIMED_WAITING状态
超时等待状态,处于超时等待的线程到时间后悔自动唤醒。
Thread.sleep(Long miis);使当前线程睡眠指定时间,这个过程不释放锁
Object wait(Long miis);使当前线程休眠指定时间,释放锁,可以通过notify/notifyAll唤醒
Thread.join(Long miis);等待当前线程最多执行指定时间。
LockSupport.parkNanos(long nanos);除非获得调度许可,否则禁止当前线程进行调度指定时间
LockSupport.parkUntil(long deadline);除非获得调度许可,否则禁止当前线程进行调度指定时间
6.TERMINATED状态
终止状态。此时线程已执行完毕。