今天主要介绍一下线程block的状态,从实例来分析线程的block状态。

背景

先介绍一下线程的所有状态信息

NEW: 线程创建之后,但是还没有启动(not yet started)。这时候它的状态就是NEW RUNNABLE: 正在Java虚拟机下跑任务的线程的状态。在RUNNABLE状态下的线程可能会处于等待状态, 因为它正在等待一些系统资源的释放,比如IO BLOCKED: 阻塞状态,等待锁的释放,比如线程A进入了一个synchronized方法,线程B也想进入这个方法,但是这个方法的锁已经被线程A获取了,这个时候线程B就处于BLOCKED状态 WAITING: 等待状态,处于等待状态的线程是由于执行了3个方法中的任意方法。 1. Object的wait方法,并且没有使用timeout参数; 2. Thread的join方法,没有使用timeout参数 3. LockSupport的park方法。 处于waiting状态的线程会等待另外一个线程处理特殊的行为。 再举个例子,如果一个线程调用了一个对象的wait方法,那么这个线程就会处于waiting状态直到另外一个线程调用这个对象的notify或者notifyAll方法后才会解除这个状态 TIMED_WAITING: 有等待时间的等待状态,比如调用了以下几个方法中的任意方法,并且指定了等待时间,线程就会处于这个状态。 1. Thread.sleep方法 2. Object的wait方法,带有时间 3. Thread.join方法,带有时间 4. LockSupport的parkNanos方法,带有时间 5. LockSupport的parkUntil方法,带有时间 TERMINATED: 线程中止的状态,这个线程已经完整地执行了它的任务

经典线程状态流转图

示例

下面是示例代码。package com.alibaba.lepao; import lombok.Data; /** * 死锁DEMO */ public class Test { //定义两把锁 static UserLock lock1 = new UserLock(); static UserLock lock2 = new UserLock(); public static class Task1 implements Runnable { @Override public void run() { synchronized (lock1) { System.out.println(Thread.currentThread().getName() + " 获得了第一把锁!!"); try { //等待另外一个线程占用第二把锁 Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } //此处死锁 synchronized (lock2) { System.out.println(Thread.currentThread().getName() + " 获得了第二把锁!!"); } } } } public static class Task2 implements Runnable { @Override public void run() { synchronized (lock2) { System.out.println(Thread.currentThread().getName() + " 获得了第二把锁!!"); //此处死锁 synchronized (lock1) { System.out.println(Thread.currentThread().getName() + " 获得了第一把锁!!"); } } } } public static void main(String[] arg) throws InterruptedException { Thread thread1 = new Thread(new Task1(), "task-1"); Thread thread2 = new Thread(new Task2(), "task-2"); //启动两个线程 thread1.start(); thread2.start(); //主线程等待子线程,防止主线程退出导致子线程退出 thread1.join(); thread2.join(); System.out.println(Thread.currentThread().getName() + " 执行结束!"); } @Data public static class UserLock{ private String name; } }

代码执行后输出入下图:

程序进入死锁BLOCK状态,及线程1等待第二把锁,线程2等待第一把锁。

分析

我们继续DUMP线程,可以得到如下的信息

可以看到,此时的线程是BLOCK状态,即两个线程都在等待锁。

DUMP线程信息获取java进程

jps -l获取线程信息

jstack -l 47142

总结

可以看到,线程在BLOCK状态就是线程获取锁的状态,大量处在BLOCK状态的线程,可能就引发了死锁,系统发生死锁现象不仅浪费大量的系统资源,甚至导致整个系统崩溃,带来灾难性后果。所以,对于死锁问题在理论上和技术上都必须予以高度重视。

另外大量线程BLOCK由于会占用线程资源,无法对外提供服务,可能引起线程池满,造成整个系统无法提供服务。

java 线程 block_JAVA线程的BLOCK状态实例分析相关推荐

  1. java 递归原理_Java中递归原理实例分析

    本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中 ...

  2. java 计算信度,11.5.2 评分者信度实例分析

    11.5.2  评分者信度实例分析 [例11.5] 某校学生举办歌唱大赛,请5位评委老师为最终进入决赛的6名同学评定等级,结果如表11-10所示,请计算其信度. 表11-10  歌唱大赛评定等级结果 ...

  3. java filter 回调_Java 异步回调机制实例分析

    Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...

  4. java 自定义标签_Java自定义标签用法实例分析

    本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...

  5. java aes pbe,JAVA对称加密算法PBE定义与用法实例分析

    本文实例讲述了JAVA对称加密算法PBE定义与用法.分享给大家供大家参考,具体如下: 一 AES.DES和3DES在使用上比较一致 二 PBE算法优点 三 PBE介绍 1.PBE:Password B ...

  6. java实例分析宠物商店_java实例分析:宠物商店.ppt

    JAVA 应用开发详解 面向对象(高级) -- 实例分析:宠物商店 实例要求 实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠 ...

  7. java list 遍历效率_java使用ArrayList遍历及效率比较实例分析

    本文实例讲述了java使用ArrayList遍历及效率比较.分享给大家供大家参考.具体如下:ArrayList arrL = new ArrayList(); ArrayList arrLTmp1 = ...

  8. Java线程到底有几种状态

    前言 很多文章说Java线程有五种状态:NEW(新建).RUNNABLE(就绪).RUNNING(运行).BLOCKED(阻塞).DEAD(死亡),而阻塞又分为等待阻塞.同步阻塞.其它阻塞. 很遗憾这 ...

  9. java的知识点29——join:合并线程 插队线程、线程的状态

    join:合并线程 插队线程  实例: 爸爸和孩子买烟的故事 /*** join:合并线程 插队线程* 爸爸和孩子买烟的故事* @author Administrator**/ public clas ...

  10. java 线程状态_浅析Java中的线程状态

    一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...

最新文章

  1. 电子商店——图片轮播
  2. 使用Zabbix自带MySQL模板监控MySQL
  3. 随机加解密java_JAVA随机数生成 Math.random和java.util.Random使用简介
  4. 使用HTTPS和OAuth 2.0保护服务到服务的Spring微服务
  5. winpcap 目的ip 是0_IP基础
  6. VB表格控件总览与例程分析
  7. 企业级oracle视频教程,企业级Oracle数据库高可用性(OracleDataGuard)DBA培训视频全集...
  8. html编码写出滚动字幕,HTML滚动字幕代码及参数详解_html/css_WEB-ITnose
  9. 在服务器上打不开新点投标文件,新点投标文件制作操作手册.doc
  10. 测试用例设计之正交试验
  11. java中j是什么意思_i 1 j 是什么意思 i.j.k是什么意思
  12. 制作歌词录入系统php,如何制作歌词字幕 制作字幕的软件
  13. 2021/10/9正睿7测Day.6
  14. 数据库ALTER语句使用
  15. 保险行业的电子签章应用场景:印章统一管、合同在线签
  16. Hbase hive kudu的区别和使用场景
  17. Python实用代码工具3|图片转视频
  18. 爱思助手不能通过wifi连接的方法
  19. 先有鸡还是先有蛋,程序员怎么看
  20. 计算机网络dcedte,路由接口:DCE和DTE区别

热门文章

  1. pe卸载win10更新补丁_禁用Win10系统更新
  2. mysql jemalloc_Jemalloc优化MySQL和Nginx
  3. Linux Debian10 如何安装jemalloc 以及 Newer version of jemalloc required 问题
  4. 【老生谈算法】matlab实现K均值聚类算法——K均值聚类算法
  5. 矩阵的Cholesky 分解
  6. 11 个超火的前端必备在线工具,终于有时间上班摸鱼了
  7. 敏捷开发模式下的质量管理
  8. Simulink飞行动力学教程
  9. html美化select样式,CSS美化select下拉框
  10. java后台实现批量打印功能