前言
线程Thread具有六种状态,并且在任一刻只能是这6种状态中的某一种状态。并且这些状态可以通过java.lang.Thread.State来表示:
线程的六种具体状态如下:
NEW
尚未启动的线程的状态。当使用new一个新线程时,如new Thread(r),但还没有执行start(),线程还没有开始运行,这时线程的状态就是NEW。
RUNNABLE
可运行线程的线程状态。当start()方法被调用时,线程就进入RUNNABLE状态。此时的线程可能正在运行,也可能没有运行
BLOCKED
受阻塞并且正在等待监视器锁的某一线程的线程状态。
以下的几种情况会使得线程进入阻塞状态:
1.等待某个操作的返回,例如IO操作,该操作返回之前,线程不会继续下面的代码。
2.等待某个“锁”,在其他线程或程序释放这个“锁”之前,线程不会继续执行。
3.等待一定的触发条件。
4.线程执行了sleep方法。
5.线程被suspend()方法挂起。
同样的一个被阻塞的线程在以下的几种情况下会被重新激活(即使其阻塞的条件得到了满足):
1.执行了sleep()方法,睡眠时间已到。
2.等待的其他线程或程序持有的“锁”已被释放。
3.正在等待触发条件的线程,条件得到满足。
4.执行了suspend()方法,被调用了resume()方法。
5.等待的操作返回的线程,操作正确返回。
WAITING
等待线程的线程状态。线程因为调用了Object.wait()方法或者Thread.join()方法而未能运行,就会进入WAITING状态。
TIMED_WAITING
具有指定等待时间的某一等待线程的线程状态。线程因为调用了Thread.sleep()方法或者加上超时值来调用Object.wait()或Thread.join()而未运行,则会进入TIMED_WAITING状态。
TERMINATED
已终止线程的线程状态。线程已运行完毕。它的run()方法已正常结束或通过抛出异常而结束。
可以通过Thread.getState()方法获得当前具体的状态类型:
public class ThreadDemo{ public static void main(String[] args){ Thread t1 = new Thread(new Runnable(){ @Override public void run() { //获取当前线程 Thread curThread = Thread.currentThread(); System.out.println("当前现场的运行状态:"+curThread.getState()); //当前线程休眠3秒 try{ curThread.sleep(3000); }catch(Exception e){ System.out.println("线程中断后的状态:"+curThread.getState()); } } }); System.out.println("线程未启动的状态; "+t1.getState()); t1.start(); System.out.println("线程启动后的状态; "+t1.getState()); //使得线程中断继而执行完毕 try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } t1.interrupt(); System.out.println("线程执行完毕的状态; "+t1.getState()); } } 复制代码
执行结果:
Waiting状态和TimedWaiting状态:
public class ThreadDemo2{ public static Object object=new Object(); public static void main(String[] args){ Thread t = new Thread(new Runnable(){ @Override public void run() { Thread currThread = Thread.currentThread(); System.out.println(String.format("%s中同步代码块的状态:%s",currThread.getName(),currThread.getState())); synchronized(object){ try { //waiting状态 object.wait(); //time-wait状态 // object.wait(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); Thread t1 = new Thread(t,"线程1"); t1.start(); System.out.println(String.format("%s启动后的状态:%s",t1.getName(),t1.getState())); Thread t2 = new Thread(t,"线程2"); t2.start(); try{ Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(String.format("%s启动后的状态:%s",t2.getName(),t2.getState())); } } 复制代码
执行结果:
object.wait():
object.wait(3000):
Block和TimedWaiting:
public class ThreadDemo2{ public static Object object=new Object(); public static void main(String[] args){ Thread t = new Thread(new Runnable(){ @Override public void run() { Thread currThread = Thread.currentThread(); System.out.println(String.format("%s中同步代码块的状态:%s",currThread.getName(),currThread.getState())); //synchronized(object){ // try { //waiting状态 // object.wait(); //time-wait状态 // object.wait(3000); //} catch (InterruptedException e) { // e.printStackTrace(); // } //} synchronized (object) { try { currThread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } }); Thread t1 = new Thread(t,"线程1"); t1.start(); System.out.println(String.format("%s启动后的状态:%s",t1.getName(),t1.getState())); Thread t2 = new Thread(t,"线程2"); t2.start(); //如果没有sleep3秒,状态都会输出runnable try{ Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(String.format("%s启动后的状态:%s",t2.getName(),t2.getState())); } } 复制代码
执行结果:以下两种情况都是对的:
不进行sleep操作的情况下输出结果:
以上就是线程的6种状态的相关介绍!