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 ...
随机推荐
- 通过Go语言创建CA与签发证书
本篇文章中,将描述如何使用go创建CA,并使用CA签署证书.在使用openssl创建证书时,遵循的步骤是 创建秘钥 > 创建CA > 生成要颁发证书的秘钥 > 使用CA签发证书.这种 ...
- NC23036 华华听月月唱歌
NC23036 华华听月月唱歌 题目 题目描述 月月唱歌超级好听的说!华华听说月月在某个网站发布了自己唱的歌曲,于是把完整的歌曲下载到了U盘里.然而华华不小心把U盘摔了一下,里面的文件摔碎了.月月的歌 ...
- Codeforces Round #792 (Div. 1 + Div. 2) A-E
Codeforces Round #792 (Div. 1 + Div. 2) A-E A 题目 https://codeforces.com/contest/1684/problem/A 题解 思路 ...
- 腾讯云EKS 上部署 eshopondapr
腾讯云容器服务(Tencent Kubernetes Engine,TKE)基于原生 kubernetes 提供以容器为核心的.高度可扩展的高性能容器管理服务.腾讯云容器服务完全兼容原生 kubern ...
- SQLZOO练习四--SUM and COUNT(聚合函数)
World Country Profile: Aggregate functions This tutorial is about aggregate functions such as COUNT, ...
- STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 互联网界的IT巨变:从DOS的编辑器,到如今的无代码开发
众所周知,Borland Pascal.Turbo Pascal.Turbo C等这类开发工具,都习惯自带IDE. 因此,我产生了一个大胆的想法. DOS时代下的Turbo C 如果说Anders这类 ...
- Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找
The link to problem:Problem - D - Codeforces D. Range and Partition time limit per test: 2 second ...
- Python词频分析
Python词频分析 一.前言 在日常工作或者生活中,有时候会遇到词频分析的场景.如果是要进行词频分析,那么首先需要对句子进行分词,将句子中的单词进行切割并按照词性进行归类. 在Python中有个第三 ...
- 不安装运行时运行.NET程序
好久没写文章了,有些同学问我公众号是不是废了?其实并没有.其实想写的东西很多很多,主要是最近公司比较忙,以及一些其他个人原因没有时间来更新文章.这几天抽空写了一点点东西,证明公众号还活着. 长久以来的 ...