面试被问java线程状态,一脸茫然?莫慌!看完这篇 从容应对!

C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解) C# 通俗易懂的介绍基础知识(七)——栈Stack(从日常生活开始讲解) 大家好,我是菌菌巧乐兹,励志用最简单的语言来讲解程序知识点。 阅读详情

在这里插入图片描述

Java的线程状态

线程方法

方法说明
setPriority(int newPriority)更改线程的优先级
static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠
void join()等待该线程终止
static void yield()暂停当前正在执行的线程对象,并执行其他线程
void interrupt()中断线程,别用这个方式
boolean isAlive()测试线程是否处于活动状态

停止线程

  • 不推荐使用JDK提供的stop()、destroy()方法。【已废弃】
  • 推荐线程自己停下来
  • 建议使用一个标志位进行终止变量 当flag=false,则终止线程运行。
package com.cnblogs.thread;
/*
测试stop
 */
public class TestStop implements Runnable{
    //设置标志位
    private boolean flag = true;

    @Override
    public void run() {
        int i = 0;
        while(flag){
            System.out.println("run...." + i++);
        }
    }

    //设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag = false;
    }

    public static void main(String[] args) {
        TestStop testStop = new TestStop();

        new Thread(testStop).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("main" + i);
            if(i == 520){
                testStop.stop();
                System.out.println("该线程停止了");
            }
        }
    }
}

线程休眠

  • sleep(时间)指定当前线程阻塞的毫秒数
  • sleep存在异常InterruptedException;
  • sleep时间达到后线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等。
  • 每个对象都有一个锁,sleep不会释放锁
package com.cnblogs.thread;

import java.util.Date;

/*
模拟倒计时
 */
public class TestSleep {
    public static void tenDown() throws InterruptedException {
        int num = 10;
        while(true){
            Thread.sleep(1000);
            System.out.println(num--);
            if(num <= 0){
                break;
            }
        }
    }

    public static void main(String[] args) {
        Date startTime = new Date(System.currentTimeMillis());//获取系统时间
        try {
            tenDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

package com.cnblogs.thread;

import java.text.SimpleDateFormat;
import java.util.Date;

/*
打印时间
 */
public class TestSleep {
    public static void tenDown() throws InterruptedException {
        int num = 10;
        while(true){
            Thread.sleep(1000);
            System.out.println(num--);
            if(num <= 0){
                break;
            }
        }
    }

    public static void main(String[] args) {
        Date startTime = new Date(System.currentTimeMillis());//获取系统时间
        while(true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//更新当前时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 注意:让cpu重写调度,礼让不一定成功!看CPU心情
package com.cnblogs.thread;
/*
测试礼让线程
 */
public class TestYield {
    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();
    }
}

class MyYield implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "线程开始执行");
        Thread.yield();//礼让
        System.out.println(Thread.currentThread().getName() + "线程结束执行");
    }
}
/*
礼让前效果:
a线程开始执行
a线程结束执行
b线程开始执行
b线程结束执行
礼让后结果:
a线程开始执行
b线程开始执行
a线程结束执行
b线程结束执行
 */

线程强制执行

  • Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
  • 可以想象成插队
package com.cnblogs.thread;

public class TestJoin implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println("VIP线程来了!!!" + i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //启动线程
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();

        for (int i = 0; i < 1000; i++) {
            if(i >= 200){
                thread.join();
            }
            System.out.println("main线程!!!" + i);
        }
    }
}

线程状态观测

Thread.State

线程可以处于以下状态之一:

  • New

    • 尚未启动的线程处于此状态
  • RUNNABLE

    • 在Java虚拟机中执行的线程处于此状态
  • BLOCKED

    • 被阻塞等待监视器锁定的线程处于此状态
  • WAITING

    • 正在等待另一个线程执行特定动作的线程处于此状态
  • TIMED_WAITING

    • 正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
  • TERMINATED

    • 已退出的线程处于此状态

一个线程可以在给定时间点处于一个状态。这些状态是不反映任何操作系统线程状态的虚拟机状态。

package com.cnblogs.thread;

public class TestState {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("0.0");
        });

        //观测状态
        Thread.State state = thread.getState();
        System.out.println(state);//NEW

        //观测启动后
        thread.start();
        state = thread.getState();
        System.out.println(state);//RUNNABLE

        //监听
        while (state != Thread.State.TERMINATED){
            Thread.sleep(100);
            state = thread.getState();
            System.out.println(state);//这段时间   TIMED_WAITING
        }
        //线程结束后 TERMINATED
    }
}

线程的优先级

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。

  • 线程的优先级用数字表示,范围从1~10

    • Thread.MIN_PRIORITY = 1;
    • Thread.MAX_PRIORITY = 10;
    • Thread.NORM_PRIORITY = 5;
  • 使用以下方式改变或获取优先级

    • getPriority.setPriority(int xxx);
package com.cnblogs.thread;

public class TestPriority{
    public static void main(String[] args) {
        //主线程默认优先级
        System.out.println(Thread.currentThread().getName() + "-->" + Thread.currentThread().getPriority());
        MyPriority myPriority = new MyPriority();
        Thread t1 = new Thread(myPriority);
        Thread t2 = new Thread(myPriority);
        Thread t3 = new Thread(myPriority);
        Thread t4 = new Thread(myPriority);
        //默认为5
        t1.start();

        t2.setPriority(7);
        t2.start();

        t3.setPriority(Thread.MAX_PRIORITY);
        t3.start();

        t4.setPriority(Thread.MIN_PRIORITY);
        t4.start();

        /*
        main-->5
        Thread-2-->10
        Thread-1-->7
        Thread-0-->5
        Thread-3-->1
         */
    }
}

class MyPriority implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "-->" + Thread.currentThread().getPriority());
    }
}

守护(deamon)线程

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如,后台记录操作日志,监控内存,垃圾回收等
package com.cnblogs.thread;
/*
测试守护线程
 */
public class TestDeamon {
    public static void main(String[] args) {
        God god = new God();
        You1 you1 = new You1();

        Thread thread = new Thread(god);
        thread.setDaemon(true);
        thread.start();//上帝线程启动

        new Thread(you1).start();

    }
}

//上帝
class God implements Runnable{

    @Override
    public void run() {
        while(true){
            System.out.println("上帝守护着你...");
        }
    }
}

//你
class You1 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 36500; i++) {
            System.out.println("你每天都开心的活着!!!");
        }
        System.out.println("再见了,世界");
    }
}

标签: [线程]
在这里插入图片描述

【Claude Code】Not logged in 未登录错误解决方案 + /login 认证路径 Claude Code 启动时提示 Not logged in 表示当前会话缺少有效凭证。本文从环境变量、API Key 配置、CI 自动化凭证脚本和系统时钟四个维度,提供完整的认证排查流程与修复方案。 阅读详情

相关推荐

实体对齐(Entity Alignment)相关论文与数据集整理

实体对齐(Entity Alignment)、知识图谱融合方法总结整理 年份 模型 主要思想 博文推荐 论文 代码 2019 Entity Alignment between Knowledge Graphs Using Attribute Embeddings 实体对齐数据集整理 名称 — DBpe-dia(DBP) LinkedGeoData(LGD) Geonames(GEO) YAGO ...

bjxxkjdxcdd的博客 1万+

面试官:说说Java线程的状态及转换

这两个状态比较好理解,当创建一个线程后,还没有调用start()方法时,线程处在 NEW 状态,线程完成执行,退出后变为TERMINATED终止状态。然后,我们看到了run()方法的执行,这个执行,是在主线程main打印了调用start()方法后线程的状态为:RUNNABLE输出后执行的。我们设想一下,如果使用if,则在线程被唤醒后,会继续往下执行,不再判断条件是否符合,这时还是没有票,粉丝也就购买不到票了。简单来说,处于BLOCKED状态的线程,还是在竞争锁的,一旦cpu有时间,它竞争到了锁、就会执行。

m0_71777195的博客 987

Python全栈入门到实战【基础篇 04】核心基础:变量与4种基础数据类型(int/float/str/bool)

本文介绍了Python编程中的变量和四种基础数据类型,作为后续所有语法的入门前提。变量是数据的“容器”,解决数据复用问题,而数据类型决定数据能进行的操作。文章详细讲解了变量的定义语法、命名规则(强制语法和推荐风格)、赋值与修改原理,并通过实操示例展示其应用场景。正确使用变量可以提升代码复用性、简化修改并增强可读性,是编程效率的核心原则。掌握这些基础知识能避免90%的新手语法错误,为学习更复杂的Python语法打下坚实基础。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 4328

Java多线程(面试篇)

java多线程

qq_64264364的博客 2674

基于YOLOv11的仓库机器人导航系统设计与实现:Amazon Robotics Challenge解决方案

本文将详细介绍一个基于YOLOv11目标检测算法的仓库机器人导航系统,该系统能够准确识别托盘(pallet)和箱子(box),为机器人提供精确的导航信息。而基于深度学习的视觉导航系统能够实时识别环境中的关键物体,如托盘和箱子,从而实现更智能的路径规划和货物搬运。YOLOv11作为YOLO系列的最新演进版本,在检测精度和速度上都有显著提升,非常适合仓储环境中的实时物体检测任务。YOLOv11在保持实时性的同时,提高了对小物体和密集物体的检测能力,这对仓储环境中的托盘和箱子检测尤为重要。

YOLO 304

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

Java多线程面试题,我丝毫不慌

甚至还有点想笑

3y 3万+

Pointnet++改进91:2025最新改进模块-RepMBConv模块

本文提出了一种改进PointNet++网络的方法,通过在特征提取模块中引入RepMBConv结构来提升模型性能。主要内容包括:1)理论部分介绍了RepMBConv的设计原理,包含自监督学习框架、动态上下文建模等创新点;2)详细给出了三步修改步骤:创建包含RepMBConv的Python模块、在pointnet2_utils.py中添加注意力机制、修改pointnet2_sem_seg.py主网络结构;3)代码实现展示了如何将RepMBConv集成到PointNetSetAbstraction模块中,形成Po

AIcurator的博客 275

Java面试--线程的生命周期状态

线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。  具体的运行过程如下:  1、通过new关键字创建后,进入到新生状态  2、调用start后进入就绪状态  3、CPU调度到本线程后,本线程开始执行。进入到运行状态  4、运行中遇到join,yield,sleep造成阻塞,进入阻塞状态。阻塞完成后,又回到就绪状态  5、线程正常执行完,或者遇到异常...

过往很淡的博客 245

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 363

华为面试手撕真题【字符串压缩】

华为面试手撕真题【字符串压缩】

MISAYAONE的博客 1万+

Java 线程状态之 RUNNABLE

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34192816的博客 868

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java面试-Runnable 与 Callable 的区别与 Future 模式

本文系统介绍了Java多线程编程中的核心概念对比与应用场景。Runnable作为基础接口只能执行无返回值的任务,而Callable则支持返回结果和异常抛出,两者通过Future模式实现异步任务管理。Future接口作为"任务凭证"提供了结果获取、状态查询和任务取消等功能,FutureTask则是连接Callable与Thread的关键桥梁。文章通过生动比喻和代码示例,对比了它们的特性差异,并阐述了在线程池环境中的实际应用。这些知识不仅是Java并发编程的基础,更是面试中的高频考点。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《互联网大厂 Java 求职者面试三轮提问及答案》

王铁牛:(思考片刻)比如在一个类中,将一些属性和方法封装起来,对外只提供必要的接口,这样可以提高代码的安全性和可维护性。王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。面试官:没关系,那你说说 Java 中的面向对象三大特性是什么?面试官:没关系,那你说说 HashMap 的扩容机制是怎样的呢?面试官:不错,那这些数据类型在内存中的存储大小分别是多少呢?面试官:很好,那请你举例说明一下封装的作用。面试官:不错,那你知道线程的状态有哪些吗?

hjc_1732的博客 1535

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java面试题_Java后端面试题精选

本文已经收录到开源项目《大厂面试指北》,获取《大厂面试指北》离线PDF版,请关注公众号"大厂面试"大厂面试公众号:MySQL慢查询优化(线上案例调优)​mp.weixin.qq.com《大厂面试指北》最佳预览地址:《大厂面试指北》​notfound9.github.io《大厂面试指北》项目地址:https://github.com/NotFound9/interviewGuide​github.c...

weixin_39864453的博客 306

搞笑程序员小兰的Java大厂面试历险记

这篇模拟文章生动再现了一位搞笑程序员小兰在大厂Java面试中的搞笑表现,通过三轮递进式提问,展现了面试官的专业性与小兰的基础性不足。文章结尾提供了所有面试问题的详尽答案,深入剖析技术原理、业务痛点及技术选型,适合Java开发人员参考学习。

Ared 637

面试官问我“CountDownLatch 和 Semaphore 有啥区别”,我让他一起数数看

名称应用场景是否基于 AQS是否共享模式任务协作、等待所有线程完成✅✅Semaphore控制并发访问数量✅✅原理状态值 CAS 修改 + 阻塞等待 + 唤醒机制关注「小奇 Java 面试」,我不仅能数数,还能数出线程间的秩序。

真正的大师永远怀着一颗学徒的心 397

《互联网大厂 Java 求职者面试:从核心知识到框架应用》

线程池可以提高线程的复用性,减少创建和销毁线程的开销。:(思考了一会儿)可以通过在配置文件中添加 MyBatis 的相关配置,然后在代码中使用 MyBatis 的 API 来操作数据库。:很好,你对 Spring Boot 的了解还比较全面。:很好,你对 RabbitMq 的了解还比较全面。:没关系,这些都是比较复杂的问题,你能理解到这个程度已经很不错了。你能说说线程池的作用以及常用的线程池有哪些吗?:很好,你对 Spring 的了解还比较深入。:很好,你对 Dubbo 的了解还比较深入。

hjc_1732的博客 311

《互联网大厂 Java 求职者面试:从核心知识到热门框架》

在互联网大厂的面试室里,面试官正襟危坐,面前摆放着一份份简历。:有 byte、short、int、long、float、double、char、boolean 这几种。:首先,我们来谈谈 Java 的核心知识吧。:很不错,回答得很准确。:(思考片刻)堆是用来存储对象的,栈是用来存储局部变量和方法调用的。:说得不错,那你能举例说明在 Java 中如何实现线程安全吗?:不错,那你能说说线程的阻塞状态是在什么情况下产生的吗?:好了,今天的面试就到这里吧。:嗯,有一定的了解。:很好,那你能详细说说堆和栈的区别吗?

hjc_1732的博客 408

Java面试核心:HashMap与多线程实战解析

HashMap作为Java集合框架的核心组件,其底层实现原理是面试必考知识点。从哈希冲突解决到扩容机制,再到线程安全的ConcurrentHashMap实现,每个技术细节都体现了数据结构与算法设计的精妙。多线程编程中,线程池的参数配置与拒绝策略选择直接影响系统性能与稳定性,合理设置corePoolSize、maximumPoolSize等参数是应对高并发的关键。在实际开发中,理解这些基础原理不仅能帮助开发者优化代码性能,还能有效避免内存泄漏等常见问题。本文通过典型面试题剖析,揭示Java核心技术在实际工程中

weixin_33906657的博客 494

《从技术深度剖析互联网大厂 Java 求职者面试实况》

从这三轮面试来看,王铁牛在 Java 核心知识、JUC、JVM 等方面的基础知识掌握不够扎实,对于一些较为复杂的概念和原理理解存在困难,在面对并发相关的问题时更是无从下手。面试官:“那我们继续,谈谈 JVM(Java 虚拟机)方面的知识,你知道 JVM 内存模型是怎样的吗?王铁牛:“接口就是定义一些方法规范,让不同的类去实现,实现了接口的类就必须实现这些方法。面试官:“咱们先从 Java 核心知识开始,说说 Java 中的多态是怎么实现的?面试官:“那你说说在 JVM 中,类加载的过程是怎样的。

hjc_1732的博客 774

《互联网大厂 Java 求职者面试:从核心知识到分布式组件》

王铁牛:(思考片刻)比如在一个类中,将一些属性和方法封装起来,对外只提供必要的接口,这样可以提高代码的安全性和可维护性。王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。面试官:非常好,那你说说 ArrayList 和 LinkedList 的区别吧。王铁牛:(犹豫了一下)好像是可以提高线程的复用性,减少创建和销毁线程的开销。面试官:不错,那这些数据类型在内存中的存储方式是怎样的呢?面试官:不错,那线程池的作用是什么呢?

hjc_1732的博客 401

Java高级工程师技术面试模拟:从基础到高并发,水货程序员的小兰如何被面试官精准点破?

本文通过模拟一场严肃专业的互联网大厂Java技术面试,展示了一位基础尚可但深度不足的求职者小兰在面试中的表现。面试官不仅考察了她的技术深度和广度,还通过幽默的方式揭示了常见的技术理解误区。文章最后提供了所有面试问题的专业答案,深入剖析技术原理、业务痛点和技术选型,适合有Java基础的读者学习和参考。

Ared 519
上一篇: 学数据库这么久了,必须要掌握的MySQL常用语句,安排!
下一篇: 看完这篇!教你三分钟学会Java项目主机启停脚本运用!
Danny_java
博客等级 码龄5年 9粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值