Java面试题-线程篇-(1)线程有几种状态,如何转换

线程流转总览图如下:

Snipaste_2023-08-28_21-17-16.png

1、在操作系统层面来看,线程有5种状态:

(1)新建

(2)就绪(有资格分到cpu,但还没拿到)

(3)运行(拿到cpu执行时间,并正在执行)

(4)阻塞(没资格分到cpu)

(5)终结

2、Java中线程的状态分为6种:

(1)新建(NEW):新创建了一个线程对象,但还没有调用start()方法。也就是这个线程对象里面的run()方法还没有被执行的时候。

(2)运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态都称为“运行”状态。线程对象创建后,调用了该对象的start()方法。此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。所以,如果一个正在运行的线程是Runnable状态,当它运行到任务的一半时,执行该线程的CPU被调度去做其他事情,导致该线程暂时不运行,它的状态依然不变,还是Runnable,因为它有可能随时被调度回来继续执行任务。

(3)阻塞(BLOCKED):表示线程阻塞于锁。

线程由Runnable状态进入到Blocked状态:只有一种途径,就是进入到synchronized代码块或方法中时,未获取到相应的monitor锁。

(4)等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

线程由Runnable状态进入waiting状态:

1>当线程中调用了没有设置Timeout参数的object.wait()方法

2>当线程调用了没有设置Timeout参数的Thread.join()方法

3>当线程调用了Locksupport.park()方法

关于Locksupportpark()方法,这里说一下,我们通过上面知道Blocked是针对synchronized monitor锁的,但是在Java中实际是有很多其他锁的,比如ReentrantLock等,在这些锁中,如果线程没有获取到锁则会直接进入Waiting状态,其实这种本质上它就是执行了Locksupportpark()方法进入了waiting状态

Blocked与waiting的区别

Blocked是在等待其他线程释放monitor锁

Waiting则是在等待某个条件,比如join的线程执行完毕,或者notify()/notifyAll()。

(5)超时等待(TIMED_WAITING):该状态不同于WAITING,它设置了超时时间,可以在指定的时间后自行返回。处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。

线程由Runnable状态进入Timed waiting状态:

1>线程执行了设置了时间参数的Thread.sleep(long millis)方法

2>线程执行了设置了时间参数的object.wait(long timeout)方法

3>线程执行了设置了时间参数的Thread.join(long millis)方法

4>线程执行了设置了时间参数的Locksupport.parkNanos(long nanos)方法和

Locksupport.parkuntil(long deadline)方法。

(6)终止(TERMINATED):表示该线程已经执行完毕。

两种情况:

当线程的run()方法完成时,线程正常退出。

出现一个没有捕获的异常,终止了run()方法,最终导致意外终止。

这6种状态定义在Thread类的State枚举中,可查看源码。另外可以通过调用getState()方法来获取当前线程是什么状态。

3、线程状态流转:

(1)BLOCKED进入RUNNABLE:

上面说了,从RUNNABLE进入到BLOCKED状态只有一种形式就是进入到synchronized代码块中时,未获取到相应的monitor锁。那要从BLOCKED进入RUNNABLE状态,就是获取到monitor锁。

(2)WAITING进入RUNNABLE:

执行Locksupport.unpark(),或者Join线程运行结束,或者被中断。

这里说一个点,就是我们从RUNNABLE状态到WAITING状态不是可以通过调用wait()方法,那从WAITING进入RUNNABLE状态是不是调用notify()或notifyAll()也可以呢?其实通过其他线程调用notify()或notifyAll()来唤醒它,则它会直接进入Blocked状态,这里大家可能会有疑问,不是应该直接进入Runnable吗?这里需要注意一点,因为唤醒waiting线程的线程如果调用notify()或notifyAll(),要求必须首先持有该monitor锁,这也就是我们说的wait()、notify()必须在synchronized代码块中。所以处于waiting状态的线程被唤醒时拿不到该锁,就会进入Blocked状态,直到执行了notify()/notifyAll()唤醒它的线程执行完毕并释放monitor锁,才可能轮到它去抢夺这把锁,如果它能抢到,就会从Blocked状态回到Runnable状态。

(3)TIMED WAITING进入RUNNABLE:

对于Timed Waiting,它存在一个超时机制,就是说如果超时时间到了,那么系统就会自动直接拿到锁,或者执行Locksupport.unpark(),或者Join线程运行结束,或者被中断。

与WAITING进入RUNNABLE一样,在Timed Waiting中执行notify()和notifyAll()也是一样的道理,它们会先进入Blocked状态,当抢到锁资源后,再进入到Runnable状态。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容