线程阻塞的原因

10187人阅读 评论(2) 收藏 举报
分类:

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

        导致阻塞的原因有很多种,大致分为三种来讨论,分别是一般线程中的阻塞,Socket客户端的阻塞,Socket服务器端的阻塞。


一般线程中的阻塞:

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

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

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

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


Socket客户端的阻塞:

        A、请求与服务器连接时,调用connect方法,进入阻塞状态,直至连接成功。

        B、当从Socket输入流读取数据时,在读取足够的数据之前会进入阻塞状态。比如说通过BufferedReader类使用readLine()方法时,在没有读出一行数据之前,数据量就不算是足够,会处在阻塞状态下。

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


Socket服务器的阻塞:

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

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

        D、线程向Socket的输出流写入一批数据,可能进入阻塞状态


        当程序阻塞时,会降低程序的效率,于是人们就希望能引入非阻塞的操作方法。    

        所谓非阻塞方法,就是指当线程执行这些方法时,如果操作还没有就绪,就立即返回,不会阻塞着等待操作就绪。Java.nio 提供了这些支持非阻塞通信的类。





查看评论

什么导致线程阻塞

阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才恢复运行。或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出InterruptedException ...
  • he3527
  • he3527
  • 2017-08-27 10:07:37
  • 869

JAVA多线程阻塞

原文出处:http://blog.csdn.net/evankaka/article/details/44153709#t9 四、线程状态转换 下面的这个图非常重要!你如果看懂了这个图,那么对于多...
  • haozhugogo
  • haozhugogo
  • 2017-02-13 17:15:33
  • 2266

java线程阻塞问题排查方法

我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题。今天终于了了这个心结。把解决过程总结下和大家分享。     首先用jstack命令打出这个进程的全部线程堆栈。拿到线程dump文件之...
  • bruce128
  • bruce128
  • 2015-08-10 18:41:08
  • 11999

关于线程阻塞的问题,留着看了

线程在执行中如果遇到(I/O 操作)如磁盘读写或网络通信,通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当...
  • wang_Bo_JustOne
  • wang_Bo_JustOne
  • 2016-06-06 19:10:51
  • 3443

线程阻塞原因

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

关于子线程死循环为什么不起作用的原因or线程的阻塞能影响进程

在测试子线程的调度问题时,发现了一个自己说不清楚的问题,就是在进程中写了一个线程,且线程函数还是一个死循环程序,在此循环中输出一句话,本想会出现一直输出一句话,结果出乎意料,只是输出几句程序结束了,很...
  • guoqianqian5812
  • guoqianqian5812
  • 2014-11-14 17:32:00
  • 1835

Java线程为何会堵塞?

堵塞状态是前述四种状态中最有趣的,值得我们作进一步的探讨。线程被堵塞可能是由下述五方面的原因造成的:(1) 调用sleep(毫秒数),使线程进入“睡眠”状态。在规定的时间内,这个线程是不会运行的。(2...
  • lengyuhong
  • lengyuhong
  • 2010-09-20 16:57:00
  • 6341

线程阻塞和中断(sleep、wait、io、锁)四种恢复方式

1、线程阻塞 一个线程进入阻塞状态可能的原因: ①通过调用sleep(millseconds)使任务进入休眠状态; class Demo1 implements Runnable t...
  • u013851082
  • u013851082
  • 2017-04-07 11:11:28
  • 3136

Java 线程阻塞、中断及优雅退出

线程阻塞一个线程进入阻塞状态的原因可能如下(已排除Deprecated方法):sleep()sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获...
  • chengmaoning
  • chengmaoning
  • 2017-06-12 19:54:17
  • 1704

线程和进程/阻塞和挂起

曾多次迷惑于阻塞和挂起状态,后来才发现,有一些文章没有区别,把(阻塞、挂起、等待)等同了,这时看语境作者说的是哪个。自己加以分析区别。 先大概这样理解一下: 挂起:一般是主动的,由系统或程序发出,...
  • u012593344
  • u012593344
  • 2016-04-25 23:04:13
  • 9014
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 1926
    排名: 2万+
    最新评论