线程阻塞和挂起(网络收集)

线程阻塞

线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行。或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出InterruptedException。

一般线程中的阻塞:

A、线程执行了Thread.sleep(int millsecond);方法,当前线程放弃CPU,睡眠一段时间,然后再恢复执行

B、线程执行一段同步代码,但是尚且无法获得相关的同步锁,只能进入阻塞状态,等到获取了同步锁,才能回复执行。

C、线程执行了一个对象的wait()方法,直接进入阻塞状态,等待其他线程执行notify()或者notifyAll()方法。

D、线程执行某些IO操作,因为等待相关的资源而进入了阻塞状态。比如说监听system.in,但是尚且没有收到键盘的输入,则进入阻塞状态。

线程挂起

线程的挂起操作实质上就是使线程进入"非可执行"状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。在线程挂起后,可以通过重新唤醒线程来使之恢复运行。

Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的。如果在不合适的时候挂起线程(比如,锁定共享资源时),此时便可能会发生死锁条件——其他线程在等待该线程释放锁,但该线程却被挂起了,便会发生死锁。另外,在长时间计算期间挂起线程也可能导致问题。

线程挂起是操作系统底层的逻辑。线程阻塞是JAVA的逻辑。一定程度上说,JAVA中的线程阻塞(sleep 锁等待 wait等)是通过挂起实现的(挂起线程是其中一种实现阻塞的方式,还有一种是不断的try lock)。

时间: 2024-10-12 12:22:49

线程阻塞和挂起(网络收集)的相关文章

weblogic的线程阻塞,严重会引起weblogic挂起现象

Weblogic 线程处理的默认时间为600s,StuckThreadMaxTime:600.在运行一些将长时间的程序时经常会由于请求时间过长,导至超时.报出more than the configured time (StuckThreadMaxTime) of "600" seconds错误.或是由于发送该请求较多,很有可能会导致weblogic的线程阻塞,严重会引起weblogic挂起现象. 解决方法通常可以如下: 1:优化报错执行的程式,检查是个执行600s的程式是否可优化或是

线程的阻塞与挂起

挂起:一般是主动的,由系统或程序发出,甚至于辅存中去.(不释放CPU,可能释放内存,放在外存) 阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号量(即有了资源)将他唤醒.(释放CPU,不释放内存) 另外,有一段话很形象: 首先这些术语都是对于线程来说的.对线程的控制就好比你控制了一个雇工为你干活.你对雇工的控制是通过编程来实现的. 挂起线程的意思就是你对主动对雇工说:"你睡觉去吧,用着你的时候我主动去叫你,然后接着干活". 使线程睡眠的意思就是你主动对雇

挂起(suspend)与线程阻塞工具类LockSupport

挂起(suspend)与线程阻塞工具类LockSupport 一般来说是不推荐使用suspend去挂起线程的,因为suspend在导致线程暂停的同时,并不会去释放任何锁资源. 如果其他任何线程想要访问被它暂用的锁时,都会被牵连,导致无法正常继续运行. 直到对应的线程上进行了resume操作. 并且,如果resume操作意外的在suspend前执行了,那么被挂起的线程可能很难有机会被继续执行,更严重的是:它所占用的锁不会被释放,因此可能会导致整个系统工作不正常,而且,对于被挂起的线程,从它的线程状

总结(3)--- 知识总结(内存管理、线程阻塞、GIL锁)

一.Python中是如何进行内存管理的? 垃圾回收:Python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值.对Python而言,对象的类型和内存都是在运行时确定的.这也是为什么我们称Python语言为动态类型的原因 引用计数:Python采用类似Windows内核对象一样的方式来对内存进行管理.每一个对象都维护这一个对指向该对象的引用的计数.当变量呗绑定在一个对象上的时候,该变量的引用计数就是1,系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的

线程阻塞工具类:LockSupport(读书笔记)

他可以在线程任意位置让线程阻塞, LockSupport的静态方法park()可以阻塞当前线程,类似的还有parkNanos() ParkUntil()等,他们实现了一个限时等待 public class LockSupportDemo { public static Object u = new Object(); static ChangeObjectThread t1 = new ChangeObjectThread("t1"); static ChangeObjectThrea

进程的阻塞和挂起的区别

理解一:挂起是一种主动行为,因此恢复也应该要主动完成,而阻塞则是一种被动行为,是在等待事件或资源时任务的表现,你不知道他什么时候被阻塞(pend),也就不能确切 的知道他什么时候恢复阻塞.而且挂起队列在操作系统里可以看成一个,而阻塞队列则是不同的事件或资源(如信号量)就有自己的队列. 理解二:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或信号量的时候出现.挂起(suspend)不释放CPU,如果任务优先级高就永远轮不到其他任务运行,一般挂起用于程序调试中的条件中断,当

多线程之Java线程阻塞与唤醒

线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java发展史上曾经使用suspend().resume()方法对于线程进行阻塞唤醒,但随之出现很多问题,比较典型的还是死锁问题.如下代码,主要的逻辑代码是主线程启动线程mt一段时间后尝试使用suspend()让线程挂起,最后使用resume()恢复线程.但现实并不如愿,执行到suspend()时将一直卡住

Java多线程——线程阻塞工具类LockSupport

简述 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞. 和 Thread.suspend()相比,它弥补了由于 resume()在前发生,导致线程无法继续执行的情况. 和 Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出 InterruptedException 异常. LockSupport 的静态方法 park()可以阻塞当前线程,类似的还有 parkNanos().parkUntil()等方法.它们实现了一个限时等待,如下图

Android学习:UI线程阻塞

一:看程序 二:现象 程序启动,button1会自动向右滑动三次,但是当点击Button2的时候,button1移动会暂停5秒. 三:线程阻塞: 当一个应用程序启动之后,android系统会为这个应用创建一个主线程.这个线程非常重要,它负责渲染视图,分发事件到响应监听器并执行,对界面进行轮询监听.因此,一般也叫做"UI线程". android系统不会给应用程序的多个元素组件,建立多个线程来执行.一个视图Activity中的多个view组件运行在同一个UI线程中.因此,多个view组件的