java 线程之线程状态
thread 类中的线程状态:
public enum state { new,//新建 runnable,// 执行态 blocked, //等待锁(在获取锁的池子里) waiting,//等待状态 timed_waiting,//定时等待 terminated; //终止 }
创建状态(new):当一个线程创建以后,就处于创建状态。thread th= new thread(()->{ });
等待锁(blocked):当线程调用 th.start() 方法,表明该线程具备获取锁的资格,进入等待锁的池子中。
可运行状态:当线程 th 获取到锁之后就进入该状态(该状态并不存在thread 类中,但是操作系统是否执行线程,是根据是否分配时间片来决定的)。
执行态(runnable):当可运行态的线程 th 获取到cpu的时间片以后就进入执行。
终止态(terminated):线程执行完毕,或者出现异常。
阻塞状态:在 thread 源码里没有改状态但是在《操作系统原理》中线程是存在该状态的。阻塞态的线程是没有释放自己本身持有的锁(例如线程运行时需要外部i/o资源,打印机、调用sleep()方法。)只是由于外部提出了干预,等外部事件执行完毕后,可直接进入可运行状态。
等待状态(waiting): 一个处于运行状态的线程还可能调用wait()方法、该方法会使调用的线程释放对象锁释,所以线程将进入等待获取锁的队列里面。join() 方法同理,join()方法底层使用的wait(),只不过join()方法作用于当前执行的线程中。通过调用notify()或notifyall()这两个方法来唤醒线程然后进入锁池状态。进入锁池状态以后继续参与锁的竞争。
定时等待状态(timed_waiting):调用 带参数的wait(long num) 方法。该方法等定时一到自动会唤醒线程然后进入锁池状态。进入锁池状态以后继续参与锁的竞争。
挂起状态:当一个处于运行状态的线程调用了suspend()方法以后,它就会进入挂起状态(这一方法已经过时不建议使用)。挂起状态的线程也没有释放对象锁,它需要调用resume()方法以后才能恢复到可运行状态。将线程挂起容易导致程序死锁。