线程的状态有:NEW,RUNNBLE,WATING,TIMED_WAITING, BLOCKED,TERMINATED
我们可以通过Thread实例中的getState()方法来查看该线程当前处于什么状态。
当我创建了一个新的线程,还没有开启线程的时候,这时候该线程的状态就是NEW状态。
当我们启动线程的时候,这时候线程的状态就会发生改变,从NEW改变为RUNNBLE状态
我们可以通过isAlive()这个方法来判断线程是否存活 ,当我们的线程完成任务的时候就会进入TERMINATED状态表示这个任务执行完成。
上述过程没有涉及到阻塞状态,因为我们的线程在执行任务的过程中没有遇到线程等待,线程休眠,锁资源的竞争。当我们在这个线程中加入sleep方法时线程会从RUNNABLE进入TIMED_WAITING
我们从字面上理解就是等待时间,如果等待时间超过了我们设定的时间约束的时候,就会被唤醒,然后再次进入RUNNABLE状态。
如果我们想要看到BLOCKED状态需要有锁竞争的存在,一把锁只能有一个线程使用,当我们有两个线程竞争一把锁的时候,一个线程会获得锁,另一个线程会处于BLOCKED状态,阻塞等待,等待锁资源的释放。
这里我们通过jConsole来观察线程状态
此时锁的拥有者是t1,然后我们的t2就会阻塞等待进入BLOCKED状态,等待t1释放锁。
当我们把t1线程中的sleep方法换成wait()方法时,wait方法可以让线程等待,直到被其他线程使用notify进行唤醒。此时t1就会进入WATING状态。