java中的线程状态转换:
看到一张舒服的java线程状态转换图:
介绍那几个重要的api:
- t.start(): 启动线程,此时t线程进入可运行状态(就绪状态),不要以为start()完就执行run方法了;
- t.yield(): t线程主动让出cpu分片,进入就绪状态(就绪状态:即指该线程只因为缺少cpu资源才进入的状态);
- t.sleep(): t线程进入阻塞状态(不会释放任何对象锁),睡眠完之后继续进入就绪状态;
- t2.join(): t线程进入阻塞状态(不释放任何对象锁),等待t2线程执行完(run方法运行结束),继续进入就绪状态;
- synchronized(o): t线程因为请求o对象锁(已经被其他线程锁住),而进入锁池,一旦由os分配到对象锁,就进入就绪状态;
- o.wait(): 此方法必须在synchronized(o){..}代码块中执行,让出o对象锁(这也是和sleep的最大区别),进入等待队列,必须由其他线程notify()或notifyAll, notify之后,也不是直接就进入就绪状态(有可能有很多线程都在等这把锁),得先进入锁池。
不吝指正。