线程的阻塞

简介: 相信像我一样的初学者遇到线程阻塞时会感到无助,那我就把自己对于线程阻塞的理解记录下来吧!

线程阻塞时的特点:


该线程放弃CPU的使用权,暂停运行,只有当阻塞的原因消除后才回到就绪状态进行运行


被其他的线程中断,该线程也会推出阻塞状态,同时抛出InterruptedException的异常


导致阻塞的原因主要为三种:

一般线程中的阻塞:


线程执行了 Thread.sleep (int n) 方法,该线程放弃CPU的使用,沉睡 n 毫秒,然后恢复运行


线程执行了一段同步代码,由于无法获得相关的同步锁,只能进入阻塞状态,等获取了同步锁,才能恢复运行


线程执行了一个对象的 wait ( )方法,进入阻塞状态,只有等到其他线程执行了该对象的 notify ( ) 或 notifyAll ( )方法,才能将其唤醒


线程执行 I/O 操作 或 进行远程通信 时,会因为等待相关的资源而进入阻塞状态 (例如,当线程执行System.in.read()方法时,如果用户没有向控制台输入数据,该线程会一直等读到用户的输入数据才会从read () 方法返回)


Socket客户端的阻塞:


向服务器请求连接时,当线程执行Socket的带参数构造方法 或者 调用connect () 方法,进入阻塞状态,直到连接成功,此线程才会从Socket的构造方法或connect () 方法返回


线程从Socket的输入流读取数据时,如果没有足够的数据,就会进入阻塞状态,直到读取了足够的数据,或者到达输入流的末尾,或者出现异常,才会从输入流的read () 方法返回或异常中断 (例如,通过BufferedReader类使用readLine () 方法时,线程再没有读出一行数据之前,数据都是不足的,会处于阻塞状态)


调用Socket的setSoLinger () 方法关闭了Socket延迟,当执行Socket的close () 方法时,会进入阻塞状态,直到底层Socket发送完所有的剩余数据


Socket服务器的阻塞:


线程执行ServerSocket的accept () 方法,等待客户端的连接,直到收到客户的连接,才从accept () 方法中返回一个Socket对象


从Socket输入流读取数据时,如果输入流没有足够的数据,就会进入阻塞状态


线程向Socket的输出流写入一批数据,可能进入阻塞状态,当线程阻塞时,会降低程序的效率


温馨提示:


Java.nio 提供了支持 非阻塞通信 的类


非阻塞方法:


当线程执行执行这些方法时,如果操作还没有就绪时,就立即返回,不会阻塞着去等待操作就绪


目录
相关文章
|
6月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
162 5
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
102 0
|
Arthas IDE Java
一种获取阻塞线程栈帧数据的思路
一种获取阻塞线程栈帧数据的思路
157 2
|
6月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
476 0
【多线程面试题十二】、阻塞线程的方式有哪些?
线程阻塞的方式包括调用sleep()方法、阻塞式IO操作、等待同步监视器的获取、等待通知(notify),以及慎用的suspend()方法。
|
5月前
|
前端开发 JavaScript
JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。
【6月更文挑战第22天】JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。回调是基础,用于在操作完成后执行函数;Promise管理异步状态,支持链式调用;async/await提供同步代码外观,简化错误处理。每种技术在处理耗时任务时都起着关键作用。
50 3
|
5月前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
39 1
|
6月前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
6月前
|
存储 网络协议 iOS开发
connect永远阻塞线程及解决方案
connect永远阻塞线程及解决方案
101 0
|
Arthas 测试技术
如何检测由synchronized或Lock引起的线程阻塞问题
如何检测由synchronized或Lock引起的线程阻塞问题
163 1