线程的阻塞

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

线程阻塞时的特点:


该线程放弃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 提供了支持 非阻塞通信 的类


非阻塞方法:


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


目录
相关文章
|
7月前
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
|
8月前
|
Arthas IDE Java
一种获取阻塞线程栈帧数据的思路
一种获取阻塞线程栈帧数据的思路
128 2
|
2月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
78 0
|
16天前
|
监控
写一个线程来监控各线程是否发生阻塞
写一个线程来监控各线程是否发生阻塞
21 0
|
8月前
|
Arthas 测试技术
如何检测由synchronized或Lock引起的线程阻塞问题
如何检测由synchronized或Lock引起的线程阻塞问题
113 1
|
8月前
|
Arthas 消息中间件 监控
记一次SSL握手导致业务线程阻塞的案例分析
记一次SSL握手导致业务线程阻塞的案例分析
111 0
|
10月前
|
缓存 运维 监控
SSL Session默认设置导致线程阻塞了几十秒的案例分析
SSL Session默认设置导致线程阻塞了几十秒的案例分析
113 0
|
10月前
线程阻塞问题
CompletableFuture.supplyAsync()执行线程,任务内有sleep方法休眠等待。导致主线程阻塞。
41 0
|
6月前
|
C++ Windows
[√]window下子线程CCLOG导致主线程阻塞问题
[√]window下子线程CCLOG导致主线程阻塞问题
124 0
|
7月前
|
Java 数据库
【JavaSE专栏79】线程死锁,多个线程被阻塞,等待彼此持有的资源
【JavaSE专栏79】线程死锁,多个线程被阻塞,等待彼此持有的资源