线程阻塞的原因

线程阻塞的原因线程阻塞的原因导致线程阻塞的原因主要由以下几方面 1 线程执行了 Thread sleep intn 方法 线程放弃 CPU 睡眠 n 毫秒 然后恢复运行 2 线程要执行一段同步代码 由于无法获得相关的同步锁 只好进入阻塞状态 等到获得了同步锁 才能恢复运行 3 线程执行了一个对象的 wait 方法 进入阻塞状态 只有等到其他线程执行了该对象的 notify 或 notif

线程阻塞的原因

导致线程阻塞的原因主要由以下几方面。

1、线程执行了Thread.sleep(int n)方法,线程放弃CPU,睡眠n毫秒,然后恢复运行。

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

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

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

5、请求与服务器建立连接时,即当线程执行Socket的带参数的构造方法,或执行Socket的connect()方法时,会进入阻塞状态,直到连接成功,此线程才从Socket的构造方法或connect()方法返回。

6、线程从Socket的输入流读取数据时,如果没有足够的数据,就会进入阻塞状态,直到读到了足够的数据,或者到达输入流的末尾,或者出现了异常,才从输入流的read()方法返回或异常中断。输入流中有多少数据才算足够呢?这要看线程执行的read()方法的类型。

int read(); 只要输入流中有一个字节,就算足够。

int read(byte[] buff); 只要输入流中的字节数目与参数buff数组的长度相同,就算足够。

String readLine(); 只要输入流中邮一行字符串,就算足够。值得注意的是,InputStream类并没有readLine方法,在过滤流BufferedReader类中才有此方法。

7、线程向Socket的输出流写一批数据时,可能会进入阻塞状态,等到输出了所有的数据,或者出现异常,才从输出流的write()方法返回或异常中断。

8、调用Socket的setSoLinger()方法设置了关闭Socket的延迟时间,那么当线程执行Socket的close方法时,会进入阻塞状态,直到底层Socket发送完所有剩余数据,或者超过了setSoLinger()方法设置的延迟时间,才从close()方法返回。

在服务器程序中,线程在以下情况下可能会进入阻塞状态。

1、线程执行ServerSocket的accept()方法,等待客户的连接,直到接收到了客户连接,才能accept()方法返回。

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

3、线程向Socket的输出流写一批数据时,可能会进入阻塞状态,等到输出了所有的数据,或者出现异常,才从输出流的write()方法返回或异常中断。

服务器程序用多线程来处理阻塞I/O,尽管能满足同时响应多个客户的需求,但是有以下局限:

(1)Java虚拟机会为每个线程分配独立的堆栈空间,工作线程数目越多,系统开销就越大,而且增加了Java虚拟机调度线程的负担,增加了线程之间同步的复杂性,提高了线程死锁的可能性;

(2)工作线程的许多时间都浪费在阻塞I/O操作上,Java虚拟机需要频繁地转让CPU的使用权,使进入阻塞状态的线程放弃CPU,再把CPU分配给处于可运行状态的线程。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225704.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:44
下一篇 2026年3月17日 上午8:44


相关推荐

  • 双管显示

    双管显示

    2021年8月15日
    61
  • 矩阵论(1)三种常见的矩阵范数

    矩阵论(1)三种常见的矩阵范数总结了三种矩阵范数:1-范数,2-范数以及∞-范数。

    2026年1月25日
    8
  • vim命令搜索_linux的vim

    vim命令搜索_linux的vim尽管目前我们已经涉及Vim的多种特性,但此编辑器的特性集如此庞大,不管我们学习多少,似乎仍然远远不足。承接我们的Vim教程系列,本文我们将讨论Vim提供的多种搜索技术。不过在此之前,请注意文中涉及到的所有的例子、命令、指令均是在Ubuntu14.04,Vim7.4下测试的。Vim中的基础搜索操作当你在Vim中打开一个文件并且想要搜索一个特定的单词或模板,第一步你必须要先按…

    2025年8月4日
    4
  • 一文读懂微前端架构

    一文读懂微前端架构转载本文请注明出处 微信公众号 EAWorld 前端开发在程序猿中无疑是一个比较苦逼的存在 作为一个前端开发 你必须要掌握 Javascript HTML CSS 这三大基础 Javascript

    2026年3月17日
    1
  • CountDownLatch用法详解

    CountDownLatch用法详解概念CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有框架服务之后执行。CountDownLatch的用法CountDownLatch典型用法1:某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为n newCountDownLatc…

    2022年7月13日
    28
  • 《老漏洞复现与分析篇》 – 其一 – shift后门

    《老漏洞复现与分析篇》 – 其一 – shift后门引言因为本菜鸡的博客没什么文章素材,所以想开一个新文章类别,本来想整一个漏洞分析和复现的,无奈由于实力不允许,只能再前面加一个“老”字,整一点多年前的老漏洞拿来复现和分析。俗话说得好,要善于总结前人的经验和智慧,才能在自己的前进道路上走得更快。本系列在我能理解的范围内我都会详细讲解,我不能理解的就靠收集网上的资料了,引用会注明来源和作者,如有侵权请联系我删除。那么废话…

    2025年12月6日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号