线程生命周期的状态有哪些?

        线程的生命周期状态有:新建、就绪、运行、阻塞、等待、死亡 六种状态。下面来看一下一个线程的一生。

        新建状态:当我们用new的方式创建了一个线程,这个线程就进入到新建状态,jvm会为新建的线程分配虚拟机栈、本地方法栈和程序计数器,如果这个时候无法申请到足够的内存空间去为它分配栈内存,那么就会抛出OOM异常;

        就绪状态:就绪状态又叫可运行状态,当我们调用了新建的线程的start方法时,这个线程就进入到就绪状态,处于就绪状态的线程是可以被CPU调度的线程,它们会被放在可运行池中,当cpu空闲的时候,就会去可运行池中选择一个线程并为它分配时间分片;

        运行状态:当某个就绪状态的线程被cpu分配了时间分片,那么它就会进入到运行状态,去执行线程的线程体,也就是run方法;

        阻塞状态:run方法中定义的是线程任务的业务逻辑,可能会在run方法的执行过程中又去调用了另外一个加锁的同步方法,那么执行这个同步方法的前提是要先获取到它的锁,所以这个线程会加入到锁的竞争中,如果获取锁失败了,那么线程会停止执行,进入到阻塞状态;如果它获取锁成功了,那么线程还是运行状态,继续执行同步方法中的逻辑;

        等待状态:一个持有锁的线程在执行过程中如果调用了锁对象的wait方法,那么它就会进入到等待状态,它会释放掉自己所持有的锁,进入到锁对象的锁等待池中,等待其他的线程调用这个锁对象的notify或者notifyAll方法将它唤醒;其他的线程调用这个锁对象的notify方法会唤醒这个锁对象的等待池中的一个线程,如果池中有多个线程处于等待状态,那么就唤醒任意一个线程;其他线程调用这个锁对象的notifyAll方法会唤醒这个锁对象的等待池中的所有等待着的线程。当池中某个处于等待状态的线程被唤醒,它会重新加入到锁的竞争中,获取锁失败,变为阻塞状态,获取锁成功,变为就绪状态,进入到可运行池中,等待cpu的再次调度;

        死亡状态:处于运行状态的线程在执行完线程体正常退出run方法后会进入死亡状态,在run方法的执行过程中出现了异常,而此异常又未被捕获处理,那么线程也会停止运行,进入死亡状态。死亡状态是线程的最后一个状态。

        

        

你可能感兴趣的:(java,jvm,开发语言)