线程有六种状态,分别是:
1. NEW:新建状态。这个状态,只存在于线程刚创建,未start之前。
2. RUNNABLE:可运行状态。Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“可运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. BLOCKED:阻塞状态。表示线程阻塞于锁。
比较常见的就是synchronized关键字,这个关键字修饰的代码块或者方法,均需要获取到对应的锁,在未获取之前,其线程的状态就一直未BLOCKED。
4.WAITING: 等待状态。进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
执行了如下的一些代码,例如Object.wait()、Thread.join()、LockSupport.park()。
当一个线程执行了Object.wait()的时候,它一定在等待另一个线程执行Object.notify()或者Object.notifyAll()。
或者一个线程thread,其在主线程中被执行了thread.join()的时候,主线程即会等待该线程执行完成。当一个线程执行了LockSupport.park()的时候,其在等待执行LockSupport.unpark(thread)。当该线程处于这种等待的时候,其状态即为WAITING。
5. TIMED_WAITING:超时等待。该状态不同于WAITING,它可以在指定的时间后自行返回。
等待的时间是有时效的。通常是调用这些方法:Thread.sleep(long)、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()、LockSupport.parkUntil()
6.TERMINATED: 终止。表示该线程已经执行完毕。
眼见为实,我们通过代码观察其状态的实际情况。
代码1:验证线程状态NEW、RUNNABLE、BLOCKED、TIME_WAITING、TERMINATED
<code>public class ThreadStartBlock implements Runnable{
@Override
public void run() {
synchronized (this){
try {
System.out.println(Thread.currentThread().getName()+"----获取到了锁---");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"----释放锁锁---");
}
public static void main(String[] args) throws InterruptedException {
ThreadStartBlock tb= new ThreadStartBlock();
Thread t1 = new Thread(tb);
Thread t2 = new Thread(tb);
//System.out.println(t1.getState());//NEW 状态
t1.start();
//System.out.println(t1.getState());//RUNNABLE状态
Thread.sleep(1000);
t2.start();
System.out.println(t1.getState());//TIMED_WAITING状态
System.out.println(t2.getState());//BLOCKED状态
t2.join();
System.out.println(t2.getState());//TERMINATED状态
}
}/<code>
代码2:验证线程状态 WAITING
<code>public class ThreadStateWait implements Runnable{
public static Integer lock = new Integer(0);
@Override
public void run() {
synchronized (lock){
try {
System.out.println(Thread.currentThread().getName()+"----获取到了锁---");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"----释放锁---");
}
public static void main(String[] args) throws InterruptedException {
ThreadStateWait tb= new ThreadStateWait();
Thread t1 = new Thread(tb);
t1.start();
Thread.sleep(1000);
System.out.println("t1:"+t1.getState());//WAITING
synchronized (lock) {
lock.notifyAll();
}
}
}/<code>
閱讀更多 IT技術研習社 的文章