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 ...
随机推荐
- 纪念我逝去的n个小时
纪念我逝去的n个小时 某人的惨案要我擦屁股=.= #include <bits/stdc++.h> using namespace std; template<class T> ...
- NC16692 [NOIP2001]求先序排列
NC16692 [NOIP2001]求先序排列 题目 题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度 ≤ 8). 输入描述 2行,均为大写字母组成的 ...
- RocketMQ之消费者启动与消费流程
vivo 互联网服务器团队 - Li Kui 一.简介 1.1 RocketMQ 简介 RocketMQ是由阿里巴巴开源的分布式消息中间件,支持顺序消息.定时消息.自定义过滤器.负载均衡.pull/p ...
- C++学习记录1
代码1:转义字符 点击查看代码 #include<iostream> using namespace std; void test01()//换行 { cout << &quo ...
- GCD Compression
题目大意: 有一个数组 a 其中有 2n 个数,把它压缩进数组 b,b 的大小是 n-1. 所谓的"压缩"指的是两种操作: 首先舍弃 a 当中的两个数(你可以任意选择). 然后每次 ...
- DTS搭载全新自研内核,突破两地三中心架构的关键技术|腾讯云数据库
随着企业规模的扩大,对数据库可用性要求越来越高,更多企业采用两地三中心.异地多活的架构,以提高数据库的异常事件应对能力. 在数据库领域,我们常听的"两地三中心"."异地多 ...
- Web Worker: Shared Worker的使用
Web Worker: Shared Worker的使用 参考资料: JavaScript高级程序第四版 https://juejin.cn/post/7064486575916187656 http ...
- Class对象功能概述和Class对象功能获取Field
Constructor[] getConstructors() Constructor getConstructor(类... parameterTypes) Constructor getDecla ...
- static关键字和代码块
static关键字 static修饰的变量称为静态变量/共享变量/类变量 用于修饰类的成员,如成员变量.成员方法以及代码块等,内static修饰的成员具备一些特殊性 1.静态变量 在java类中使用s ...
- 什么是WordPress
首先,假设您没有WordPress的经验: 我将从基础开始. 在本教程中,我将回答问题:"什么是WordPress?" 在这篇文章中,我将说明您可以在哪里获得WordPress以及 ...