Java的线程状态
在我们平时写code的时候,经常会使用到多线程。其中线程所处的状态就是我们需要进程思考的问题。
- 线程有哪些状态
NEW: 一个线程刚被创建,但是没有被使用就是处于这个状态
RUNNABLE: 一个线程正在jvm虚拟机中被执行就是处于这个状态
BLOCKED:一个线程等待一个moniter,就是处于这个状态.
WAITING:一个线程无休止的等待另一个线程就是处于这个状态
TIMED_WAITING:一个线程等待林一个线程,但是有具体的timeout,就是处理这个状态
TERMINATED:一个线程执行结束了,就是处于这个状态
public class Hello {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Object lock2 = new Object();
// NEW
Thread test = new Thread();
// RUNNABLE
Thread test1 = new Thread(() -> {
int i = 0;
synchronized (lock){
while (true) {
i++;
}
}
});
// BLOCK
Thread test2 = new Thread(() -> {
int i = 0;
synchronized (lock){
while (true) {
i++;
}
}
});
// Waiting
Thread test3 = new Thread(() -> {
int i = 0;
synchronized (lock2){
try {
lock2.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
// Time_waiting -----3s--> TERMINATED
Thread test4 = new Thread(() -> {
int i = 0;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
test1.start();
test2.start();
test3.start();
test4.start();
Thread.sleep(1000);
System.out.println(test1.getState());
System.out.println(test2.getState());
System.out.println(test3.getState());
System.out.println(test4.getState());
Thread.sleep(3000);
System.out.println(test4.getState());
}
}
- 状态的转换
- BLOCKED: 进入同步块/方法,等待获取monitor。或者调用Object.wait之后被notify唤醒,但是没有获取monitor。
- Waiting:
- Object.wait with no timeout
- Thread.join with no timeout
- LockSupport.park
- Timed_waiting:
- Thread.sleep
- Object.wait with timeout
- Thread.join with timeout
- LockSupport.parkNanos
- LockSupport.parkUntil
package com.hardy.pojo;
public class Hello {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread test1 = new Thread(() -> {
synchronized (lock){
try {
System.out.println("test1");
lock.wait();
Thread.sleep(10000);
System.out.println("test1 end");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("end");
}
});
Thread test2 = new Thread(() -> {
synchronized (lock){
System.out.println("test2");
try {
lock.wait();
Thread.sleep(10000);
System.out.println("test2 end");
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println("end");
}
});
Thread test3 = new Thread(() -> {
int i = 0;
synchronized (lock){
try {
System.out.println("test3");
lock.notifyAll(); // 这里是notifyAll会唤醒所有的wait线程。但是线程都是需要monitor的,monitor只能被一个线程持有。所以notifyAll之后,一个线程变成Runable,一个线程变成Block
System.out.println("test3 end");
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println("end");
}
});
test1.start();
test2.start();
Thread.sleep(1000);
test3.start();
Thread.sleep(1000);
System.out.println(test1.getState());
System.out.println(test2.getState());
System.out.println(test3.getState());
}
}
思考:如果notifyAll变成notify,那么另外两个线程的状态如何改变?
Java的线程状态的更多相关文章
- Java多线程 - 线程状态
转自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的 ...
- Java多线程:线程状态以及wait(), notify(), notifyAll()
一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...
- java中线程状态
刚开始接触java时,就觉得多线程是一个障碍,不容易理解,当时选择了跳过,不过工作一段时间后,发现这块还是需要深入研究一下的,及时平时工作中不使用多线程,但一定会使用web容器,比如tomcat,也是 ...
- Java之线程状态
Java线程有6种状态: 1.New(新生),使用new Thread(r)创建一个新线程时,该线程处于新生状态,新生状态会为线程的执行做一些准备. 2.Runnable(可执行),调用线程的star ...
- Java多线程 线程状态及转换 wait sleep yield join
线程的状态转化关系(1). 新建状态(New):新创建了一个线程对象.(2). 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- JAVA并发-线程状态
一.线程基本状态 新建:线程已创建但start()方法还没执行 就绪(可运行):start()方法已运行,但还没被选择 运行:从就绪线程中选择出某一个线程进行run()操作 阻塞(不可运行):线程正在 ...
- java中线程状态-死亡
线程死亡: 线程会以如下3种方式结束,结束后就处于死亡状态. 1.run()或call()方法执行完成,线程正常结束. 2.线程抛出一个未捕获的Exception或Error 3.直接调用该线程的st ...
- java笔记----线程状态转换函数
注意:stop().suspend()和 resume()方法现在已经不提倡使用,这些方法在虚拟机中可能引起“死锁”现象.suspend()和 resume()方法的替代方法是 wait()和 sle ...
- JVM线程状态Running、Sleeping、Wait、Park、Monitor
1,使用JVisualVM时,打开Threads监控,我们可以发现Java的线程状态有以下几种: 2,JVM线程状态: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_W ...
随机推荐
- vue this.getOptions is not a function
错误提示截图: 问题原因:是由于sass-loader引用的版本过低导致 解决方法:在package.json中增加以下配置后 "sass-loader": "^10&q ...
- 网站迁移服务器后CPU、内存飙升,设置robots.txt 问题
User-agent: SemrushBotDisallow: /User-agent: SemrushBot-SADisallow: /User-agent: SemrushBot-BADisall ...
- 最佳实践 | 疫情之下,了解 eolink 如何助力远程办公!
新冠疫情肆虐,eolink 结合自身长期的远程研发协作经验,为企业推出 API 管理远程协作指南,以下方案不仅在 Eolinker 内部,也在众多客户中得到验证,希望能够帮助您快速了解如何将 API ...
- 用cmd命令进行磁盘清理(主要是系统盘)
作用:清理磁盘(主要是系统盘)中不需要的垃圾文件操作方法: 第一步:Windows键+R键 调出cmd命令窗口(窗口图如下:) 第二步:输入框中输入cmd命令,按下Enter键,进入如下图界面: 第三 ...
- 多重分派(multiple dispatch)与访问者模式
什么是双重分派 什么是分派(dispatch) 首先我们需要理解「分派」的含义.分派就是将方法调用与对应的具体方法绑定起来.而判断的依据有两点,这两者可称为「宗量」: 方法的接收者,也就是哪个对象调用 ...
- 如何在Excel/WPS表格中批量查询顺丰快递信息?
如何在Excel/WPS表格中批量查询顺丰快递信息? 上期我们讲了如何在Excel/WPS表格中批量查询快递信息(还不知道的小伙伴可以看这里:https://zhuanlan.zhihu.com/p/ ...
- idea引入fastjson的jar包:ClassNotFound
idea 手动添加fastjson的jar包时,既在项目依赖里添加了,又在WEB-INF下的lib库里添加了 但是启动后就是加载不到,报错:ClassNotFound 尝试了好久,也参考了网上的许多建 ...
- Redis系列4:高可用之Sentinel(哨兵模式)
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 1 背景 从第三篇 Redis系列3:高可用之主从架构 ,我们知道,为Re ...
- qbxt五一数学Day3
目录 1. 组合数取模 1. \(n,m\le 200\),\(p\) 任意 2. \(n,m\le 10^6\),\(p\ge 10^9\) 素数 3. \(n,m\le 10^6\),\(p\le ...
- 钡铼BL102分布式IO系统如何应用于锂电池行业
近年来,全球新能源汽车的蓬勃发展促进了锂电池行业的发展.随着锂电池标准化程度的提高,电池和模块规格的标准化是未来的发展趋势,也促进了自动化模块生产线的发展. 锂电池模块生产线通过涂胶-电池堆叠-组装- ...