线程小结

本文详细介绍了线程的四种基本状态及其转换条件,包括new、runnable、blocked和dead状态。此外,还讨论了线程间如何通过各种方法进行同步与通信,如sleep、wait、notify等,并强调了一些最佳实践和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<p><span style="font-size: x-small;"></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">1,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">线程的四种状态:</span><span lang="EN-US"><span style="font-family: Times New Roman;">new</span></span><span style="">,</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">,</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">,</span><span lang="EN-US"><span style="font-family: Times New Roman;">dead</span></span><span style="">。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">new</span></span></span><span style="font-size: small;"><span style="">状态:线程刚刚被创建,还没有调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">start</span></span><span style="">方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">3,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">runnable</span></span></span><span style="font-size: small;"><span style="">状态:线程调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">start</span></span><span style="">()方法以后。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: small;"><span style="">注:处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态的线程不一定会被执行,要看操作系统会不会给分配时间片。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">4,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">blocked</span></span></span><span style=""><span style="font-size: small;">状态:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态的线程在以下五种情况下会转入到</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态:</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">a,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">sleep</span></span></span><span style=""><span style="font-size: small;">()方法被调用</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">b,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">wait</span></span></span><span style=""><span style="font-size: small;">()方法被调用。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">c,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">等待</span><span lang="EN-US"><span style="font-family: Times New Roman;">io</span></span><span style="">结束</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">d,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">等待文件锁。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">e,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">suspend</span></span></span><span style=""><span style="font-size: small;">()方法被调用。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="">处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态的线程会在以下情况下转入到</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">a,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">sleep</span></span></span><span style=""><span style="font-size: small;">()方法中的时间结束</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">b,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">被其他线程的</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">()或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">notifyAll</span></span><span style="">方法唤醒。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">c,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">等待的文件锁得到</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">d,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Io</span></span></span><span style=""><span style="font-size: small;">结束</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">e,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">resume</span></span></span><span style=""><span style="font-size: small;">()方法被执行。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">5,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">终止状态</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">a,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">run</span></span></span><span style=""><span style="font-size: small;">方法执行结束。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">b,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">stop</span></span></span><span style=""><span style="font-size: small;">()方法被调用。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">6,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">无法区分处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态的线程是否正在运行。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style=""><span style="font-size: small;">无法区分一个线程是处于刚刚创建的状态还是死亡状态。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: small;"><span style="">无法区分一个线程是处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态还是</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">isAlive</span></span><span style="">()方法是判断是处于活动状态(</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">的和)还是其它状态。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">7,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">resume</span></span></span><span style="font-size: small;"><span style="">()方法只有在</span><span lang="EN-US"><span style="font-family: Times New Roman;">suspend</span></span><span style="">方法被调用的时候才有效,不推荐。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">8,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">join</span></span></span><span style=""><span style="font-size: small;">()方法。让其他线程等待,直到本线程执行完毕。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">9,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">run</span></span><span style="">方法中,不赞成直接使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">stop</span></span><span style="">方法在停止自身线程,这就意味着我们必须在</span><span lang="EN-US"><span style="font-family: Times New Roman;">run</span></span><span style="">方法中不断的进行判断,来决定自身是否应该被停止。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">10,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">在一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">windows</span></span><span style="">系统中,线程可以不调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">sleep</span></span><span style="">方法,其它线程也可以获得时间片,但是如果换作其他线程就必须不时调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">sleep</span></span><span style="">或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">yield</span></span><span style="">方法,以使其他线程获得时间片。尤其在网络变成过程中,由于不能确定自己程序所处的操作系统环境,就更要注意。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">11,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">等待进入同步方法的进程和调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">wait</span></span><span style="">方法的进程有着本质的区别:等待进入同步方法的进程一旦获得对象锁之后,会自动进入。但是调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">wait</span></span><span style="">方法以后的进程会放弃自己所获得的锁对象,并会一直处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态,直到另外某个进程调用了</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">方法或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">notifyAll</span></span><span style="">方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">12,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">notifyAll</span></span></span><span style="font-size: small;"><span style="">方法唤醒所有处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态的线程,</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">方法随机唤醒一个。因此</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">方法是不安全的。可能会导致死锁。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">13,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">java</span></span></span><span style=""><span style="font-size: small;">语言并没有可以预防死锁的机制,因此在设计多线程程序时候,必须要保证每一个被阻塞的线程迟早会被通知。或者有一个线程会一直运行。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">14,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">stop</span></span><span style="">方法</span><span lang="EN-US"><span style="font-family: Times New Roman;">suspend</span></span><span style="">方法都是不明智的。</span><span lang="EN-US"><span style="font-family: Times New Roman;">stop</span></span><span style="">方法会强行关闭线程,因此是不安全的。</span><span lang="EN-US"><span style="font-family: Times New Roman;">Suspend</span></span><span style="">方法在把线程挂起的时候,不会释放改线程的对象锁,因此会导致死锁。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">15,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">有一个可以把线程锁住,而且不会导致死锁的方法,教科书:</span><span lang="EN-US"><span style="font-family: Times New Roman;">38</span></span><span style="">页</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">16,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">setDaemon(),</span></span></span><span style=""><span style="font-size: small;">这是服务线程,把当前线程设置为服务线程,表明当前线程是为其他线程服务的,如果其他所有线程都停止了,那么本线程也就停止了。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">17,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">使用管道进行线程通讯的最重要理由是为了让线程变得简单。生产者只需要把生产的数据放入管道,消费者只需要从管道中获得数据,而不用考虑同步性</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">18,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">当一个线程获取某个对象的一个同步方法的对象锁的时候,其它线程就无法访问该对象的所有同步方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">19,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Synchronaized</span></span></span><span style="font-size: small;"><span style="">用于类方法的时候,对象锁来自于</span><span lang="EN-US"><span style="font-family: Times New Roman;">this.class</span></span><span style="">实例。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">20,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Synchronaized</span></span></span><span style="font-size: small;"><span style="">用于对象方法的时候,对象锁来自于</span><span lang="EN-US"><span style="font-family: Times New Roman;">this</span></span><span style="">实例</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">21,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Sleep</span></span></span><span style="font-size: small;"><span style="">方法:不会释放对象锁,但是会把</span><span lang="EN-US"><span style="font-family: Times New Roman;">cpu</span></span><span style="">时间让给他人。线程具有的方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">22,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Wait</span></span></span><span style="font-size: small;"><span style="">方法,释放对象锁,直到</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">notifyall</span></span><span style="">被调用。对象具有的方法。在同步方法中被调用。因为</span><span lang="EN-US"><span style="font-family: Times New Roman;">wait</span></span><span style="">方法如果在没有获取对象锁的情况下被调用的话,会抛出</span><span lang="EN-US"><span style="font-family: Times New Roman;">IllegalmonitorStateException</span></span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">23,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Sleep</span></span></span><span style="font-size: small;"><span style="">是静态方法,因此最佳的调用方式是</span><span lang="EN-US"><span style="font-family: Times New Roman;">Thread.sleep()</span></span><span style="">;</span></span></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值