首页 > 编程知识 正文

多线程的四种状态,java异常类型分为哪几种

时间:2023-05-06 21:22:35 阅读:48816 作者:3781

java线程有什么状态

发布时间: 2020-07-24 16:16:22

来源:亿速云

阅读: 88

作者: Leah

今天我们来谈谈java线程有什么样的状态。 很多人可能不太了解,为了更好地了解,小编总结了以下内容。 我希望大家能通过这篇文章得到。 java线程的五种状态: 1、初始状态。 2、处于可执行状态、可执行线程池中,等待被选为线程调度,取得cpu的使用权。 3、运行状态。 4、阻塞状态是指线程出于某种原因放弃了cpu使用权。 5、死亡状态、死亡线程不得再次复活。

Java中线程的生命周期大致分为5种状态。

1、新创建了初始状态(NEW )线程对象。

2、创建可执行(RUNNABLE )线程对象后,其他线程(例如main线程)调用了该对象的start ) )方法。 处于这种状态的线程位于可执行线程池中,等待在线程计划中进行选择,然后获取cpu的使用权。

3、运行可执行状态线程获取cpu时间片,并运行程序代码。

4 .“阻止”(BLOCKED )阻止状态是线程由于某种原因放弃cpu使用权限,也就是说,通过让出cpu timeslice而暂时停止的状态。 在线程进入“可执行”(runnable )状态之前,没有机会再次获取cpu timeslice并进入“可执行”(running )状态。 块的情况分为(1)、块等待) 3种。 运行(running )线程为o.wait )方法,JVM将其放入队列中等待。

) 2、同步阻塞)当正在运行(运行)的线程获取对象的同步锁定时,如果该同步锁定被另一线程占用,则JVM将该线程放入锁定池。

) 3、其他块:如果执行(running )线程执行thread.sleep(longms )或t.join )方法,或者发出I/O请求,JVM将阻止该线程当“sleep”(状态超时、连接)等待线程结束或超时,或者I/O操作完成时,线程将再次进入“可运行”(runnable )状态。

5、死亡(DEAD )、线程run、main )或run ),如果方法异常终止,线程将终止生命周期。 死亡线程不能再次复活。

一.线程状态图

二.初始状态

实现Runnable接口,继承Thread后得到线程类,new实例出现后线程处于初始状态

三.可运行状态

1、可行的状态只是说你有资格执行,如果调度程序不选择你,你就永远是可行的状态。

2、调用线程的start (方法,该线程变为可执行状态。

3、等待当前线程的sleep (方法结束,其他线程的连接)结束,用户输入结束,一个线程获取对象锁,这些线程也变为可执行状态。

4、当前线程的时间片过期。 调用当前线程的yield ()方法使当前线程处于可执行状态。

5、锁定池中的线程获取对象锁定后,进入可执行状态。

四.运行状态

线程调度器是从可执行池中选择线程作为当前线程时线程的状态。 这也是线程进入运行状态的唯一方法。

五.死亡状态

1 .线程的run ) )方法完成或主线程的main ) )方法完成时,我们认为它已经死了。 此线程对象可能是活动的,但不是已经单独运行的线程。 线程死了,就不能复活。

2、在死线程上调用start (方法时,会抛出Java.lang.illegalthreadstateexception异常。

六.闭塞状态

1、当前线程t调用Thread.sleep (方法,当前线程处于阻塞状态。

2、当前线程上运行的其他线程t2调用join ()方法,当前线程处于阻塞状态。

3、等待用户输入时,当前线程进入阻塞状态。

七、排队(这是Object中的方法,但影响了线程) )。

1、在调用obj的wait ()、notify )方法之前,必须获取obj锁。 也就是说,必须写在同步)、obj )代码部分。

2、队列的相关步骤和图线程1获取了对象a的锁定,正在使用对象a。

线程1调用对象a的wait (方法。

线程1解除对象a的锁定,并立即进入队列。

池中的对象争夺对象a的锁定。

线程5获取对象a的锁定,进入同步块,并使用对象a。

线程5调用对象a的notifyAll (方法,调用所有线程,所有线程都进入锁定池。 |||||线程5调用对象a的通告)方法,以唤醒不知道要唤醒谁的线程。 被唤醒的线程进入锁池。

notifyAll ) )方法的同步结束,线程5解除对象a的锁定。

锁定池中的线程争用对象锁,但不知道线程1什么时候可以抢走。 |||||在锁定池的第6步中唤醒的线程一起争夺对象锁定。

"center">

八、锁池状态

当前线程想调用对象A的同步方法时,发现对象A的锁被别的线程占有,此时当前线程进入锁池状态。简言之,锁池里面放的都是想争夺对象锁的线程。

当一个线程1被另外一个线程2唤醒时,1线程进入锁池状态,去争夺对象锁。

锁池是在同步的环境下才有的概念,一个对象对应一个锁池。

九、几个方法的比较

Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入阻塞,但不释放对象锁,millis后线程自动苏醒进入可运行状态。作用:给其它线程执行机会的最佳方式。

Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的cpu时间片,由运行状态变会可运行状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。

t.join()/t.join(long millis),当前线程里调用其它线程1的join方法,当前线程阻塞,但不释放对象锁,直到线程1执行完毕或者millis时间到,当前线程进入可运行状态。

obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout)timeout时间到自动唤醒。

obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。

看完上述内容,你们对java线程有哪几种几种状态有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。