Java的线程状态

在我们平时写code的时候,经常会使用到多线程。其中线程所处的状态就是我们需要进程思考的问题。

  1. 线程有哪些状态

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());
    }
}
  1. 状态的转换

  2. BLOCKED: 进入同步块/方法,等待获取monitor。或者调用Object.wait之后被notify唤醒,但是没有获取monitor。

  3. Waiting:
  4. Object.wait with no timeout
  5. Thread.join with no timeout
  6. LockSupport.park
  7. Timed_waiting:
  8. Thread.sleep
  9. Object.wait with timeout
  10. Thread.join with timeout
  11. LockSupport.parkNanos
  12. 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,那么另外两个线程的状态如何改变?

Original: https://www.cnblogs.com/hardyzhou/p/16600369.html
Author: hardyzhou
Title: Java的线程状态

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585150/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java容器

    1.Iterable 接口和 Iterator 接口 Iterable接口从 JDK 1.5 开始出现,是 Java 容器的最顶级的接口之一,该接口的作用是使容器具备迭代元素的功能…

    Java 2023年6月9日
    090
  • 【Java面试】面试如何让面试官面的很爽,看完这道面试题,finally块一定会执行吗?

    “finally块一定会执行吗?”这是最近一个工作3年的小伙伴去面试的时候遇到的问题。你遇到这个问题会怎么回答呢?大家好,我是Mic,一个工作了14年的Ja…

    Java 2023年6月16日
    096
  • [Java]ArrayList源码解析

    ArrayList源码解析 1. 核心源码解读 package java.util; import java.util.function.Consumer; import java…

    Java 2023年6月5日
    072
  • mybatisPlus整理

    1.在启动类上面添加@MapperScan注解,扫描mapper包 1 @SpringBootApplication 2 @MapperScan("com.qiao.de…

    Java 2023年5月30日
    081
  • LEDE 虚拟机安装

    虽然我对路由器没什么兴趣,但是紧跟潮流还是有必要的,现在因为网络闭关锁国政策,很多人都想自己搭配一台私人的服务器,不想被商业公司左右数据安全。我感觉这个是一个商机,建议大家可以朝这…

    Java 2023年5月30日
    085
  • java多线程之线程的同步与锁定(转)

    一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数…

    Java 2023年5月29日
    061
  • [Java]Java类中的各元素初始化顺序

    先初始化变量,次初始化代码块,再初始化构造器;(先变量,次代码块,再构造器) Original: https://www.cnblogs.com/knqiufan/p/166516…

    Java 2023年6月5日
    055
  • 新人公司选择及进入公司后注意事项

    公司/平台选择 优先选择走在未来航道上的那些 快速发展的公司 确认所选公司是否是一家 以技术驱动,以技术文化为主导的公司 新人进入公司后要注意 一般的开发流程是:需求分析➡️设计➡…

    Java 2023年6月15日
    070
  • 爽翻天!告别Java。一起来使用kotlin开发完整客户端

    必须写在前面:从Java转向Kotlin,只需要几天时间! 本篇是kotlin开发Android系列教程的最后一篇。前面几篇介绍了kotlin的基本语法、与java的不同之处等。在…

    Java 2023年5月29日
    0102
  • 人类的规划能力有多强大?

    本文章译自OptaPlanner官网上,Geoffrey De Smet先生的博文,链接如下: https://www.optaplanner.org/blog/2015/06/0…

    Java 2023年6月16日
    0102
  • flowable初体验踩坑及概述

    遵守bpmn2.0协议(前提)(还在找比较好用的绘图工具) 可以使用idea插件进行绘图保存成xml进行改造编写 Flowable BPMN visualizer和JBoss jB…

    Java 2023年6月15日
    077
  • SpringBoot 前后端分离 实现验证码操作

    验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot 是如何提供服务的。 本文基于的 Spring Boot 的…

    Java 2023年6月8日
    072
  • [Java]《On Java》阅读记录之 — 可变参数重载问题

    有下面一段代码: public class OverloadingVarargs2 { static void f(float i , Character… args) { S…

    Java 2023年6月5日
    073
  • Nginx笔记

    文档可以参考淘宝的: 安装(CentOs7): /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http:/…

    Java 2023年5月30日
    057
  • String.format的使用

    String.format()字符串常规类型格式化的两种重载方式 format(String format, Object… args) 新字符串使用本地语言环境,制定…

    Java 2023年5月29日
    068
  • Vue前端压缩图片

    一、在组件包下新建compressImage.js 二、在所需页面引入compressImage.js 三、使用方法 四、拿到压缩后的二进制文件该怎样发送给后台呢?(我后台用的是 …

    Java 2023年6月9日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球