Java 线程重点 面试笔记(线程状态,安全停止线程..)

包括线程状态、Thread.yield()、Thread.join()、线程安全停止、标志位、中断等,都是线程这块秋招的重点。


1. 线程状态(Thread.State)

Java 中线程有 6 种状态

状态

含义

进入条件

NEW

新建状态

Thread t = new Thread(...);

RUNNABLE

可运行状态

调用 start() 后,等待 CPU 调度

BLOCKED

阻塞状态

等待锁(synchronized)

WAITING

无时间限制等待

Object.wait()、Thread.join()(无超时)、LockSupport.park()

TIMED_WAITING

有时间限制的等待

sleep(millis)、join(millis)、wait(millis)

TERMINATED

终止状态

线程执行完 run() 方法

注意

  • RUNNABLE 不一定在 CPU 上运行,只是处于可运行队列中。

  • BLOCKED、WAITING、TIMED_WAITING 是阻塞线程状态。

2. Thread.yield()

作用:提示线程调度器,当前线程愿意让出 CPU,但只是“礼貌性提示”,不保证立即切换。

效果:线程从 RUNNING → RUNNABLE,允许同优先级线程运行。

特点

  • 不阻塞线程

  • 不释放锁

示例

for (int i = 0; i < 10; i++) {System.out.println(i);Thread.yield(); // 提示调度器切换线程
}

3. Thread.join()

作用:让当前线程等待调用 join() 的线程执行完成。

效果:当前线程进入 WAITING 或 TIMED_WAITING,直到被等待的线程 TERMINATED

可选超时:join(long millis),超时后线程继续执行。

示例

Thread a = new Thread(() -> System.out.println("线程A执行"));
a.start();
a.join(); // 当前线程等待a执行完
System.out.println("主线程继续");

4. 安全停止线程

4.1 原则

  • Java 不推荐使用 stop()、suspend()、resume(),会破坏资源和锁,容易死锁。

  • 推荐方式:使用标志位(flag)或 interrupt() 请求中断。

4.2 标志位(Flag)

概念:线程内部定义的布尔变量,用于表示线程是否继续运行。

特点

  • 线程自己检查标志位决定是否退出

  • 使用 volatile 修饰保证线程可见性

    这里使用volatile是因为,volatile可以使当前变量的变化能立即被别的线程看到。

示例

class DownloadTask implements Runnable {private volatile boolean running = true;public void stop() {running = false;}@Overridepublic void run() {while (running) {System.out.println("下载中...");}System.out.println("线程停止");}
}

4.3 中断线程(Interrupt)

概念:interrupt() 不是直接停止线程,而是发出中断请求,线程自己决定是否退出。

阻塞线程:sleep()、wait()、join() 会抛 InterruptedException。

非阻塞循环:线程需检查 isInterrupted() 或结合标志位。

示例

class DownloadTask implements Runnable {@Overridepublic void run() {while (!Thread.currentThread().isInterrupted()) {try {Thread.sleep(500); // 阻塞操作,可响应中断} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 重新设置中断标志break; // 安全退出循环}System.out.println("下载中...");}System.out.println("线程安全停止");}
}Thread t = new Thread(new DownloadTask());
t.start();
Thread.sleep(2000);
t.interrupt(); // 请求停止线程

核心理解

  • interrupt() 只是一种请求,不强制停止

  • 循环型任务检查中断标志,阻塞任务捕获异常退出

  • 标志位适合循环任务,interrupt 适合阻塞任务

5. 小结

  1. 线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

  2. yield():礼貌性让出 CPU

  3. join():等待线程完成,可带超时

  4. 安全停止线程

    • 循环任务用 标志位

    • 阻塞任务用 interrupt() + 异常处理

  5. 阻塞 vs 非阻塞:阻塞线程可响应 interrupt,非阻塞线程需自己检查标志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98107.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zigbee:Polling 终端设备的睡眠机制和功耗

一、Zigbee 设备类型与功耗基础 首先,Zigbee网络中的设备角色决定了其功耗特性。Zigbee定义了三种逻辑设备类型: 协调器 (Coordinator)​​:网络的中心,必须始终供电,不能睡眠。功耗最高。 路由器 (Router)​​:负责中继数据,扩展网络范围。通常也需持续供电,以保持网…

Python迭代协议完全指南:从基础到高并发系统实现

引言&#xff1a;迭代协议的核心价值在Python编程中&#xff0c;迭代协议是构建高效、灵活数据结构的基石。根据2024年Python开发者调查报告&#xff1a;92%的高级数据结构依赖迭代协议85%的数据处理框架基于迭代协议构建78%的并发系统使用自定义迭代器65%的内存优化方案通过迭…

vsan高可用:确保可访问性、全部数据迁移,两种类型权衡

目录1.如果我3台机器&#xff0c;其中有1台机器突然故障&#xff0c;那么走的是保证可用&#xff0c;还是全量数据迁移&#xff1f;这个怎么算&#xff1f;一、先明确&#xff1a;故障场景 vs 维护场景的核心差异二、3台主机故障时&#xff0c;vSAN的具体处理逻辑&#xff08;为…

51单片机1(单片机基础,LED,数码管)

1.嵌入式嵌入式&#xff08;Embedded&#xff09;指的是一种专用计算机系统&#xff0c;它被"嵌入"或内建到一个更大的设备、产品或系统中&#xff0c;作为其核心控制部分&#xff0c;专门用于执行特定的任务或功能。通俗来讲就是以应用为中心&#xff0c;以计算机技…

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技术(收发器/接收器)和无人机跟踪应答器

Aerobits-用于 sUAS 和 UTM/U-Space 的微型 ADS-B 技术&#xff08;收发器/接收器&#xff09;和无人机跟踪应答器Aerobits 是一家专门为无人机 (UAV) 和无人驾驶飞机开发微型应答器和航空电子系统的公司。我们的硬件和软件解决方案基于专利技术&#xff0c;采用极低 SWaP 封装…

Spring Security资源服务器在高并发场景下的认证性能优化实践指南

Spring Security资源服务器在高并发场景下的认证性能优化实践指南 摘要&#xff1a;本文从原理与实践两个层面&#xff0c;深入解析Spring Security资源服务器在高并发场景下的认证性能优化策略&#xff0c;通过关键源码解读与实际示例&#xff0c;帮助开发者有效提升系统吞吐与…

SQL Server事务隔离级别

SQL Server 提供了多个事务隔离级别&#xff0c;用于控制并发事务如何访问和修改数据时的可见性、锁定行为以及可能遇到的并发问题&#xff08;如脏读、不可重复读、幻读&#xff09;。这些级别在数据一致性、并发性能和锁定开销之间进行权衡。 以下是 SQL Server 支持的主要隔…

DeepSeek R1大模型微调实战-llama-factory的安装与使用

文章目录概要1.安装必要的环境2.安装 PyTorch3.安装 Transformers 和 Datasets4.克隆 LLaMA Factory 仓库和安装LLaMA Factory5.准备数据和模型配置6.运行 LLaMA Factory7.监控和调整8.后续步骤概要 LLaMA Factory 是一个简单易用且高效的大型语言模型训练与微调平台。通过它&…

IDE mac M芯片安装报错:如何解决“InsCode.app 已损坏”,无法打开

IDE mac M芯片安装报错&#xff1a;如何解决“InsCode.app 已损坏”&#xff0c;无法打开 摘要 在 macOS 上安装并运行 InsCode IDE 时&#xff0c;不少开发者会遇到这样的报错&#xff1a; “InsCode.app 已损坏&#xff0c;无法打开。您应该将它移到废纸篓。” 这种情况在 …

EasyExcel:阿里开源的高效 Excel 处理工具,轻松解决 POI 内存溢出问题

在日常开发中&#xff0c;Excel 文件的导入导出是非常常见的需求。无论是数据批量导入、报表生成还是数据备份&#xff0c;我们都离不开对 Excel 的操作。但传统的 POI 框架在处理大数据量 Excel 时&#xff0c;常常会遇到内存溢出的问题&#xff0c;让开发者头疼不已。 今天给…

软件启动时加配置文件 vs 不加配置文件

一、基本概念不加配置文件启动直接执行启动命令&#xff0c;使用软件自带的默认参数。方便、快速&#xff0c;适合测试环境。缺点&#xff1a;灵活性差、配置不可控、不安全。redis-server zookeeper-server-start.sh kafka-server-start.sh指定配置文件启动启动时加载外部配置…

[ubuntu][C++]onnxruntime安装cpu版本后测试代码

下载官方预编译包后&#xff0c;怎么用呢。可以参考这个源码跑测试环境&#xff1a;ubuntu22.04onnxruntime1.18.0测试代码&#xff1a;CMakeLists.txtcmake_minimum_required(VERSION 3.12) project(onnx_test)# 设置C标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD…

栈:有效的括号

题目描述&#xff1a;给定一个只包含‘[’,{,(,),},]的字符串&#xff0c;判断该字符串是否括号有效。 括号有效的要求是&#xff1a; 每个左括号都有对应的右括号。每个右括号都有对应的左括号。左括号必须以正确的顺序闭合。 示例 1&#xff1a; 输入&#xff1a;s "…

微前端架构:解构前端巨石应用的艺术

在数字化转型浪潮中&#xff0c;企业级前端应用正变得日益复杂。微前端架构作为一种创新的解决方案&#xff0c;正在重新定义大型前端应用的构建方式&#xff0c;使多个团队能够独立开发和部署功能模块一、微前端架构的核心价值理念微前端架构的本质是将后端微服务理念扩展到前…

《LangChain从入门到精通》系统学习教材大纲

&#x1f4da; 《LangChain从入门到精通》系统学习教材大纲 目标&#xff1a;帮助你系统掌握LangChain理论与实践&#xff0c;成为具备独立开发能力的AI应用开发者。 学习周期建议&#xff1a;8~12周&#xff08;每天2~3小时&#xff09;&#xff0c;配合项目实战可加速成长。 …

Redis 的相关文件作用

Java 项目中使用 Redis 的相关文件&#xff0c;下面我来逐一解释它们的作用&#xff1a;1. RedisDemoApplicationTests.java 作用&#xff1a;这是 Spring Boot 项目的测试类。用途&#xff1a; 通常用于写单元测试或集成测试。测试 Redis 功能是否正常&#xff0c;比如连接、读…

【React】性能提升方案:Reat.memo, useMemo,useCallback用法详解

前言&#xff1a;Reat.memo, useMemo,useCallback是React中用于性能优化的三个核心API&#xff0c;它们分别针对组件渲染&#xff0c;计算缓存和函数引用进行优化。一、React.memo作用&#xff1a;缓存组件&#xff0c;当父组件重新渲染时&#xff0c;若子组件的props未变化&am…

Alibaba Cloud Linux 3 安装Docker

Alibaba Cloud Linux 3 基于 Red Hat Enterprise Linux (RHEL) 兼容内核&#xff0c;安装 Docker 的步骤与 RHEL/CentOS 系列类似&#xff0c;以下是具体操作&#xff1a; 1. 卸载旧版本&#xff08;如有&#xff09; sudo dnf remove docker docker-client docker-client-la…

每日一练001.pm

题目详情&#xff1a; P5705 【深基2.例7】数字反转 - 洛谷 题目描述 输入一个不小于 100 且小于 1000&#xff0c;同时包括小数点后一位的一个浮点数&#xff0c; 例如 123.4 &#xff0c;要求把这个数字翻转过来&#xff0c;变成 4.321 并输出。 #include<iostream&g…

AI智能优化SEO关键词策略实战

本文聚焦AI如何智能优化SEO关键词策略&#xff0c;通过实战案例分享高效技巧&#xff0c;帮助提升网站搜索排名和流量转化效果。内容涵盖AI革新关键词策略的原理、智能优化技巧的实际应用、高效关键词布局方法、避免常见错误的实战指南&#xff0c;以及综合策略推动排名飞跃的路…