java线程的6种状态和验证

线程有六种状态,分别是:

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>


分享到:


相關文章: