主页 > 新闻资讯 > 数据分析培训之Java中的线程阻塞是怎么回事?

数据分析培训之Java中的线程阻塞是怎么回事?

作者:覃老师 浏览次数: 2021-10-14 17:54
数据分析培训之Java中的线程阻塞是怎么回事?
 
一、什么是线程阻塞?什么情况会导致线程阻塞
在某一时刻某一个线程在运行一段代码的时候,这时候另一个线程也需要运行,但是在运行过程中的那个线程执行完成之前,另一个线程是无法获取到CPU执行权的(调用sleep方法是进入到睡眠暂停状态,但是CPU执行权并没有交出去,而调用wait方法则是将CPU执行权交给另一个线程),这个时候就会造成线程阻塞。

二、java程序中出现线程阻塞的几种情况:
1、睡眠状态:
Thread.sleep (long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。
数据分析培训
2、等待状态:
 当一个线程正在运行时调用了wait()方法,此时该线程需要交出CPU执行权,也就是将锁释放出去,交给另一个线程,该线程进入等待状态,但与睡眠状态不一样的是,进入等待状态的线程不需要设置睡眠时间,但是需要执行notify()或者notifyall()来对其唤醒,自己是不会主动醒来的,等被唤醒之后,该线程也会进入就绪状态,但是进入仅需状态的该线程手里是没有执行权的,也就是没有锁,而睡眠状态的线程一旦苏醒,进入就绪状态时是自己还拿着锁的。

3、礼让状态:
Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。

4、自闭状态:
当一个线程正在运行时,调用了一个join()方法,此时该线程会进入阻塞状态,另一个线程会运行,直到运行结束后,原线程才会进入就绪状态。这个比较像是”走后门“,本来该先把你的事情解决完了再解决后边的人的事情,但是这时候有走后门的人,那就会停止给你解决,而优先把走后门的人事情解决了;
数据分析培训
5、suspend() 和 resume() :
两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。
典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。Thread中suspend()和resume()两个方法在JDK1.5中已经废除,因为有死锁倾向。

以上是数据分析培训之Java中的线程阻塞的讲解。如果想了解更多详情,请点击成都卡米古大数据官网!成都大数据培训学校、大数据开发培训、数据分析与挖掘、零基础课程正在招生中!
 

标签:
热点排行
推荐文章
立即申请>>