1.当线程继承Thread或者实现了Runnable创建了线程对象后,当new线程对象过后线程就进入了初始的状态。
2.当线程对象调用了start()方法的时候,线程启动进入可运行的状态。
3.线程进入可运行状态后,如果逻辑完成那么线程将会终结,如果没有执行完毕中间JVM分配时间片用完,将进入可运行状态,一旦线程被JVM选中则立即执行。
4.运行状态的情况比较复杂
第一:线程如果执行run() main()方法结束后,完成逻辑,线程就进入Terminated
第二:当线程调用sleep()或者join()方法就会进入Blocked状态,但是要注意的是阻塞的线程是不释放当前所占有的系统资源,当sleep()结束或者join()等待其他线程来到,当前线程则进入Runnable状态等待JVM分配资源。
第三:当线程进入Runnable状态,但是还没有开始运行的时候,此时发现需要的资源处于同步状态synchronized,这个时候线程将会进入Time waiting,JVM会使用队列对这些线程进行控制,既先进行Time waiting的线程会先得到JVM资源进行执行进入Waiting
第四:如果处于Runnable的线程调用yield()让出JVM资源,那么就会进入New状态和其他New状态线程进行竞争重新进入Runnable
第五:如果当前线程调用wait()方法,则当前线程进入Time waiting但是这个时候当前线程会释放所占有的JVM资源,进入这个状态过后是不能自动唤醒的,必须调用notify()或者notifyAll()方法,线程进入Waiting。
1.首先sleep()是Thread类的方法静态方法,需要通过Thread类调用,Thread.sleep()。而wait()和notify()是Object类中的实例方法,因为java所有类都继承于object类,所有类中都可以使用。
2.wait(),和notify()必须用在synchronized代码块中调用,否则会抛出异常(因为wait()需要释放对象锁,如果不在synchronized代码块中不能保证拥有对象锁)。
3.当在synchronized代码块中使用sleep(),线程会被挂起,但不会释放对象锁,所以如果有其他线程等待执行该synchronized代码块,一直会被阻塞,等待该线程被唤醒释放对象锁。
4.当在synchronized代码块中使用wait(),线程会被挂起,需要notify()唤醒,但该线程会释放对象锁,所以其他线程可以执行该synchronized代码块。