Java 多线程生命周期

多线程生命周期

1、五个阶段

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。其之间的转换关系如下图
在这里插入图片描述

1.1 新建

当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。

此阶段可以发生的状态变化:
(1)调用线程的start()方法后,可以进入就绪状态

注意:
(1)启动线程使用start()方法,而不是run()方法。不要调用线程对象的run()方法。调用start0方法来启动线程,系统会把该run()方法当成线程执行体来处理
(2)直按调用线程对象的run()方法,则run()方法立即就会被执行,而且在run()方法返回之前其他线程无法并发执行。也就是说,系统把线程对象当成一个普通对象,而run()方法也是一个普通方法,而不是线程执行体

1.2 就绪

就是调用的线程的start()方法后,JVM 进程会去创建一个新的线程,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行。

1.3 运行

CPU调度发生,并从任务队列中选中了某个就绪线程时,该线程会进入Running执行状态,并且开始调用run()方法中逻辑代码

此阶段可以发生的状态变化:
(1)被转换成死亡状态,比如调用 stop() 方法;

(2)被转换成阻塞状态,比如调用了sleep, wait 方法被加入 waitSet 中;

(3)被转换成阻塞状态,如进行 IO 阻塞操作,如查询数据库进入阻塞状态;

(4)被转换成阻塞状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;

(5)该线程的时间片用完,CPU 再次调度,进入就绪状态;

(6)线程主动调用 yield 方法,让出 CPU 资源,进入就绪状态

1.4 阻塞

当发生如下情况时,线程将会进入阻塞状态

(1) 线程调用sleep()方法主动放弃所占用的处理器资源

(2)线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞

(3) 线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。关于同步监视器的知识、后面将存更深入的介绍

(4)线程在等待某个通知(notify)

1.5 死亡

线程会以如下3种方式结束,结束后就处于死亡状态:

(1) run()或call()方法执行完成,线程正常结束。

(2)线程抛出一个未捕获的Exception或Error。

(3)直接调用该线程stop()方法来结束该线程——该方法容易导致死锁,通常不推荐使用。

发布了24 篇原创文章 · 获赞 14 · 访问量 1976

猜你喜欢

转载自blog.csdn.net/qqq3117004957/article/details/104553087