java 线程 block_JAVA线程的BLOCK状态实例分析
今天主要介绍一下线程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状态实例分析相关推荐
- java 递归原理_Java中递归原理实例分析
本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中 ...
- java 计算信度,11.5.2 评分者信度实例分析
11.5.2 评分者信度实例分析 [例11.5] 某校学生举办歌唱大赛,请5位评委老师为最终进入决赛的6名同学评定等级,结果如表11-10所示,请计算其信度. 表11-10 歌唱大赛评定等级结果 ...
- java filter 回调_Java 异步回调机制实例分析
Java 异步回调机制 一.什么是回调 回调,回调.要先有调用,才有调用者和被调用者之间的回调.所以在百度百科中是这样的: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用 ...
- java 自定义标签_Java自定义标签用法实例分析
本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...
- java aes pbe,JAVA对称加密算法PBE定义与用法实例分析
本文实例讲述了JAVA对称加密算法PBE定义与用法.分享给大家供大家参考,具体如下: 一 AES.DES和3DES在使用上比较一致 二 PBE算法优点 三 PBE介绍 1.PBE:Password B ...
- java实例分析宠物商店_java实例分析:宠物商店.ppt
JAVA 应用开发详解 面向对象(高级) -- 实例分析:宠物商店 实例要求 实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠 ...
- java list 遍历效率_java使用ArrayList遍历及效率比较实例分析
本文实例讲述了java使用ArrayList遍历及效率比较.分享给大家供大家参考.具体如下:ArrayList arrL = new ArrayList(); ArrayList arrLTmp1 = ...
- Java线程到底有几种状态
前言 很多文章说Java线程有五种状态:NEW(新建).RUNNABLE(就绪).RUNNING(运行).BLOCKED(阻塞).DEAD(死亡),而阻塞又分为等待阻塞.同步阻塞.其它阻塞. 很遗憾这 ...
- java的知识点29——join:合并线程 插队线程、线程的状态
join:合并线程 插队线程 实例: 爸爸和孩子买烟的故事 /*** join:合并线程 插队线程* 爸爸和孩子买烟的故事* @author Administrator**/ public clas ...
- java 线程状态_浅析Java中的线程状态
一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...
最新文章
- 电子商店——图片轮播
- 使用Zabbix自带MySQL模板监控MySQL
- 随机加解密java_JAVA随机数生成 Math.random和java.util.Random使用简介
- 使用HTTPS和OAuth 2.0保护服务到服务的Spring微服务
- winpcap 目的ip 是0_IP基础
- VB表格控件总览与例程分析
- 企业级oracle视频教程,企业级Oracle数据库高可用性(OracleDataGuard)DBA培训视频全集...
- html编码写出滚动字幕,HTML滚动字幕代码及参数详解_html/css_WEB-ITnose
- 在服务器上打不开新点投标文件,新点投标文件制作操作手册.doc
- 测试用例设计之正交试验
- java中j是什么意思_i 1 j 是什么意思 i.j.k是什么意思
- 制作歌词录入系统php,如何制作歌词字幕 制作字幕的软件
- 2021/10/9正睿7测Day.6
- 数据库ALTER语句使用
- 保险行业的电子签章应用场景:印章统一管、合同在线签
- Hbase hive kudu的区别和使用场景
- Python实用代码工具3|图片转视频
- 爱思助手不能通过wifi连接的方法
- 先有鸡还是先有蛋,程序员怎么看
- 计算机网络dcedte,路由接口:DCE和DTE区别