线程的六种状态

嘿,各位编程爱好者!今天咱们来聊聊线程的六种状态,这可是线程生命周期中的关键环节哦。
首先,每个线程都会经历NEW、RUNNABLE和TERMINATED这三个状态。
下面,我就来给大家详细解读一下每个状态的小秘密。

NEW状态,就是线程刚创建但还没启动的时候;RUNNABLE状态,意味着线程正在Java虚拟机里忙碌地执行任务;BLOCKED状态,则是因为线程在等待某个锁而被挂起;WAITING状态,是线程在无限期地等待其他线程完成某个操作;TIMED_WAITING状态,和WAITING有点像,但这个状态下的线程会等待一个指定的时间;最后,TERMINATED状态,就是线程执行完毕后进入的状态。

流程是这样的:线程刚创建后,如果没有启动,它就处于NEW状态。
启动后,它变成RUNNABLE,开始执行任务。
任务完成或者被终止,线程就进入TERMIBATED状态。
不过,在RUNNABLE状态下,线程可能会因为时间片用完或者其他原因进入BLOCKED、WAITING或者TIMED_WAITING状态,也就是我们常说的阻塞状态。
但别担心,一旦条件成熟,比如被唤醒或者抢到了CPU时间片,线程就能重新回到RUNNABLE状态继续执行啦!

线程的几种状态

好嘞,咱们聊聊线程这回事儿。
就拿我手头的联想拯救者Y9 000P,系统是Windows 1 1 来说吧。

简单来说,线程就是操作系统里头,能被它安排去干活的最小单位了。
它得住在进程里面,一个进程里面可以跑好多个线程,每个线程就像一条独立的小路,在里面按自己的顺序一步步往前走。

说到线程的“生涯状态”,主要有这么几种:
1 . 新建 (New):刚被创建出来,还没等它跑起来呢,就是这种状态。
2 . 运行中/就绪 (Runnable/Ready):这是最活跃的状态了。
要么是它抢到了CPU的时间片,正在执行代码;要么就是它准备好了,就等着CPU分给它时间片呢。
3 . 阻塞 (Blocked):这得不巧,要是线程正好在等某个资源,比如一个锁被别人用着呢,它就得暂时停下来,进入阻塞状态,得等那个锁被释放了才能继续。
4 . 等待 (Waiting):这种状态有点特别,是那种无限期地等着,得靠别的线程来调用某个特定的方法才能唤醒。
5 . 超时等待 (Time_Waiting):跟等待不一样,这种是设定了时间限制的,过了一定的时间没等到,就会自动结束等待状态。
6 . 终止 (Terminated):当线程把该干的活儿都干完了,执行结束了,就变成这个状态了。

再深入点儿看,线程其实挺重要的。
它是操作系统调度任务的基本单元。
有点区分,比如Windows下的线程(Win3 2 线程)通常是内核线程,由操作系统直接管着;Linux下的POSIX线程(pthread)呢,更多是用户进程自己管;Windows 7 的线程则是混合模式。
不管哪种,它们都能独立地被调度执行。

一个进程里的所有线程,共享这个进程的基本资源,比如内存地址空间、打开的文件、信号处理机制这些。
但是呢,每个线程都有自己的“小隔间”,比如独立的调用栈(call stack)、自己的寄存器环境(register context),还有线程本地存储(thread-local storage),这些是互不干扰的。

所以一个进程可以搞很多线程,让它们并行处理不同的任务。
特别是在像我的Y9 000P这种多核CPU上,用多线程编程就能明显感觉到好处,程序整体的效率(执行吞吐率)会大大提高。
就算是在单核的电脑上,多线程也挺有用的。
你可以把程序里负责读写文件、跟人交互这些容易“卡壳”的部分,跟负责大量计算的部分分开,让专门负责计算的“苦力线程”(workhorse thread)去处理计算任务,这样也能提升程序整体的响应速度和效率。

Java面试题,线程的几种状态是什么

聊起线程这东西啊,它在执行的时候,其实会经历好几个不同的状态,咱们一个个来说说:
首先,有个状态叫“就绪”(Runnable)。
这就像是线程已经准备好了,随时可以开跑,但能不能马上跑起来,那就得看CPU的脸色了。

然后,“运行中”(Running)。
这表示线程正在执行代码,是真正干活的状态。

接下来,“等待中”(Waiting)。
线程这时候就像卡住了,处于阻塞状态,得等着外头啥事儿处理完了它才能继续。

“睡眠中”(Sleeping)也挺有意思的,线程是被强行睡着的,不是自愿的。

还有,“I/O阻塞”(Blocked on I/O)。
线程在等I/O操作弄完,比如读写文件啥的。

“同步阻塞”(Blocked on Synchronization)也是一样,线程在等获取锁,这事儿没搞定,它也就动不了了。

最后,“死亡”(Dead)。
线程执行完了,任务完成了,也就没用了,进入了死亡状态。

线程有几种状态

在Java里,咱们聊聊线程的那些事儿。
一个线程啊,它得经历五个阶段,就像是人生一样,有始有终。

首先是新建(NEW)状态,这就像是线程刚出生,对象是有了,但是还没人给它发令枪,也就是还没调用start()方法,它就还待在襁褓里,没怎么活动。

接下来是可运行(RUNNABLE)状态,这时候线程被唤醒了,调用了start()方法,它就在那儿排队,等着CPU这位大老板给它分配任务呢。
这个阶段,它就等着被调度,看看能不能跑起来。

一旦线程被选中,它就进入了运行(RUNNING)状态,这时候它就真正开始执行任务了,就像是拿到了任务的执行权,开始埋头苦干。

不过,线程有时候也会遇到麻烦,得暂停一下,这就进入了阻塞(BLOCKED)状态。
这个状态又分几种情况:有时候是线程自己愿意休息,执行了o.wait()方法,就乖乖地被放到等待队列里;有时候是它想抢夺一个被别人占用的资源,结果没抢到手,就被推进了锁池;还有时候是它被要求暂时停下,比如执行了Thread.sleep()或者t.join(),或者是去处理I/O操作。
等到这些事情处理完了,比如sleep时间到了,join的线程也结束了,或者I/O也处理好了,线程又能重新回到可运行状态,继续排队等待机会。

最后,当一个线程完成了它的使命,执行完了run()或者main()方法,或者是因为出错了退出了run()方法,它就进入了死亡(DEAD)状态。
这时候,线程的生命周期就结束了,它就像是一支用完了的箭,不会再有第二次飞翔的机会。