Thread 类的基本用法、Java 线程的几种状态

在Java中,Thread类是多线程编程的核心。

线程创建 (Thread Creation)
  • 创建线程主要有两种逻辑:继承Thread类或实现Runnable接口。
    • 方式1:继承 Thread 类,重写run()
// 自定义线程类继承Thread class MyThread extends Thread { // 重写run(),定义线程执行逻辑 @Override public void run() { System.out.println("子线程执行:" + Thread.currentThread().getName()); } } // 使用 public class Demo { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); // 3. 调用start()启动线程(不能直接调用run()) } } 
  • 方式2:实现Runnable接口,传给Thread
// 实现Runnable接口 class MyRunnable implements Runnable { @Override public void run() { System.out.println("子线程执行:" + Thread.currentThread().getName()); } } // 使用 public class Demo { public static void main(String[] args) { // 把Runnable实例传给Thread Thread t = new Thread(new MyRunnable()); t.start(); // 启动线程 } } 
线程中断 (Thread Interruption)
  • 线程中断不是强制停止线程,而是一种协作机制,即给线程发一个“请停止”的信号。
  • void interrupt():标记线程为 “中断状态”
  • boolean isInterrupted():判断线程是否处于中断状态
  • 若线程在sleep/wait/join时被中断,会抛出InterruptedException,且中断状态会被清除
Thread t = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { // 检测中断状态 System.out.println("线程运行中..."); try { Thread.sleep(1000); } catch (InterruptedException e) { // 捕获中断异常后,中断状态会被清除,需手动终止循环 System.out.println("线程被中断"); Thread.currentThread().interrupt(); // 重新标记中断(可选) break; } } }); t.start(); // 主线程1秒后中断子线程 Thread.sleep(1000); t.interrupt(); 
线程等待 (Thread Join)
  • 有时主线程需要等待子线程执行完毕后再继续执行,这时可以使用join()。
  • t.join():当前线程会进入阻塞状态,直到线程t执行结束。
  • 带参数的 join(long millis):设置最大等待时间,如果超时线程还没结束,当前线程就不再等待。
Thread t = new Thread(() -> { System.out.println("子线程开始执行"); try { Thread.sleep(2000); } catch (InterruptedException e) {} System.out.println("子线程执行完毕"); }); t.start(); // 主线程等待t执行完(最多等3秒) t.join(3000); System.out.println("主线程继续执行"); 
线程休眠 (Thread Sleep)
  • static void sleep(long millis):让当前线程暂停指定时间(不会释放锁),抛出InterruptedException
System.out.println("开始休眠"); try { Thread.sleep(2000); // 当前线程休眠2秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("休眠结束"); 
获取线程实例 (Get Current Instance)
  • 在编写通用代码(尤其是 Runnable 中)时,常需要知道是谁在运行。
  • Thread.currentThread():返回代码当前正在执行的那个线程对象的引用。
  • 常用操作:获取线程 ID (getId())、获取线程名称 (getName()) 等。
// 获取当前线程(这里是main线程) Thread mainThread = Thread.currentThread(); System.out.println("当前线程名:" + mainThread.getName()); // 输出"main" // 子线程实例 Thread t = new Thread(() -> { Thread current = Thread.currentThread(); System.out.println("子线程名:" + current.getName()); // 输出"Thread-0" }); t.start(); 

Java线程的几种状态

线程状态一共有几种?
  • Java线程共有6种状态:
    • NEW (新建)
    • RUNNABLE (可运行)
    • BLOCKED (阻塞)
    • WAITING (等待)
    • TIMED_WAITING (超时等待)
    • TERMINATED (终止)
每种状态的含义与切换条件
  1. NEW (新建)
  • 含义:创建了线程对象(new Thread()),但尚未调用 start() 方法。
  • 切换:调用 start() 方法后,进入 RUNNABLE 状态。
  1. RUNNABLE (可运行)
  • 含义:Java 将操作系统中的“就绪(Ready)”和“运行中(Running)”两种状态统称为 RUNNABLE。处于该状态的线程可能正在 CPU 上执行,也可能正在等待操作系统分配时间片。
  • 切换:
    • 就绪 -> 运行:获得 CPU 时间片。
    • 运行 -> 就绪:CPU 时间片用完,或主动调用 Thread.yield()。
  1. BLOCKED (阻塞)
  • 含义:线程正在等待获取一个排他锁(如进入synchronized 代码块/方法),但该锁目前被其他线程持有。
  • 切换:
    • RUNNABLE -> BLOCKED:尝试进入 synchronized 区域失败。
    • BLOCKED -> RUNNABLE:其他线程释放锁,当前线程成功竞争到锁。
  1. WAITING (等待)
  • 含义:线程处于无限期的等待状态,不会被分配 CPU 时间,必须等待其他线程显式地唤醒。
  • 切换:
    • RUNNABLE -> WAITING:调用 Object.wait()(不带参数)、Thread.join()(不带参数)或 LockSupport.park()。
    • WAITING -> RUNNABLE:其他线程调用 Object.notify()、notifyAll() 或 LockSupport.unpark()。
  1. TIMED_WAITING (超时等待)
  • 含义:与 WAITING 类似,但在指定的时间后会自动唤醒,不需要其他线程显式唤醒。
  • 切换:
    • RUNNABLE -> TIMED_WAITING:调用 Thread.sleep(ms)、Object.wait(ms)、Thread.join(ms) 等带时间参数的方法。
    • TIMED_WAITING -> RUNNABLE:时间结束,或被提前唤醒(如 notify())。
  1. TERMINATED (终止)
  • 含义:线程已经执行完毕(run() 方法正常结束)或因异常退出了执行。
  • 切换:线程一旦进入此状态,生命周期结束,不可再次启动(再次调用 start() 会抛出异常)。

Read more

武汉火影数字:VR大空间在文旅产业的创新应用

武汉火影数字:VR大空间在文旅产业的创新应用

VR大空间是一种利用空旷的物理空间,结合先进的VR技术,让用户能够在其中自由移动并深度体验虚拟世界的创新项目方式。 在科技飞速发展的当下,文旅产业正经历着前所未有的变革。VR大空间技术宛如一颗璀璨的新星,迅速崛起并成为文旅产业的新宠。无论是繁华都市的商场,还是热门的旅游景区,都能看到VR大空间体验项目的身影,吸引着众多游客和消费者前来尝鲜。 VR 大空间:解锁文旅新体验 打破时空限制,畅游世界奇观 以往,人们想要领略世界各地的文化遗产和自然奇观,往往需要长途跋涉,花费大量的时间和金钱。而VR大空间技术的出现,彻底打破了这种时间和空间的限制,通过VR大空间技术,游客足不出户,或者在城市中的VR体验场馆,就能实现云游览,感受不同地域文化的震撼。 深度互动,化身故事主角 在传统的文旅体验中,游客大多是被动的观察者,而VR大空间技术让游客成为了故事的参与者,极大地增强了旅游体验的趣味性和参与感,游客不再是只能观看,而是能够真正地亲身参与。通过全新的手势交互方式,游客能够轻松地一秒入戏,成为故事中的主角,在唯美仙界、冰寒雪域、神秘宫殿中无尽漫游、梦幻角逐,全面调动触感、风感、冰感、

Formality:原语(primitive)的概念

Formality:原语(primitive)的概念

相关阅读 Formalityhttps://blog.ZEEKLOG.net/weixin_45791458/category_12841971.html?spm=1001.2014.3001.5482         原语(primitive)一般指的是语言内置的基本构件,它们代表了基本的逻辑门和构件,通常用于建模电路的基本功能,例如Verilog中的门级建模会使用and、or等关键词表示单元门。Formality也存在原语的概念,这一般出现在对门级网表进行建模时,本文将对此进行详细解释。         假设以例1所示的RTL代码作为参考设计(可以看出添加了// synopsys sync_set_reset综合指令让Design Compiler将其实现为带同步复位端的D触发器),例2所示的综合后网表作为实现设计,其中data_out_reg原语是一个带同步复位端的D触发器(FDS2)。 // 例1 module ref( input clk, input reset, input data_in, output reg data_

Windows安装Neo4j保姆级教程(图文详解)

Windows安装Neo4j保姆级教程(图文详解)

文章目录 * 前言 * 系统要求 * 安装Java环境 * 步骤1:检查Java版本 * 步骤2:下载Java JDK * 步骤3:安装Java JDK * 下载Neo4j * 步骤1:访问官方网站下载Neo4j * 步骤2:解压Neo4j * 启动Neo4j服务 * 步骤1:以管理员身份打开命令提示符 * 步骤2:导航到Neo4j的bin目录 * 步骤3:安装Neo4j服务 * 步骤4:启动Neo4j服务 * 步骤5:验证服务状态 * 访问Neo4j * 基本操作和配置 * 常用管理命令 * 配置文件修改 * 常见问题解决 * 问题1:端口被占用 * 问题2:Java版本不匹配 * 问题3:服务启动失败 * 总结 前言 Neo4j是一款强大的图数据库,特别适合处理复杂的关系数据。本教程将手把手教你在Windows系统上安装Neo4j,并配置可视化工具,让你快速上手图数据库的世界。 系统要求 在开始安装之前,请确保你的系统满足以下要求: 操作系统:

如何用腾讯云轻量应用服务器内置OpenClaw应用搭建OpenClaw并接入QQ、飞书机器人,下载skill,开启对话

如何用腾讯云轻量应用服务器内置OpenClaw应用搭建OpenClaw并接入QQ、飞书机器人,下载skill,开启对话

诸神缄默不语-个人技术博文与视频目录 如需OpenClaw下载安装、配置、部署服务可以联系:https://my.feishu.cn/share/base/form/shrcnqjFuoNiBPXjADvRhiUcB1B 我发现腾讯云买服务器可以用QQ钱包,这不得狠狠把我多年来抢的红包狠狠利用一下。 OpenClaw我之前玩了几天,现在把gateway关了,因为我感觉第一是感觉AI对于一些细微的执行逻辑还是绕不明白,而且API太慢了等得我着急,慢得我都不知道它是死了还是只是慢,不如我直接一个古法编程下去开发一个自己的工具。我本来是想拿OpenClaw当时间管理助手的,但是研究了一番感觉它作为整个人完整的时间/项目/文件系统/财务/生活管理助手的潜力还是很大的。但是,也就仅止于潜力了,跟OpenClaw绕记账怎么记实在是把我绕火大了……第二,正如网上一直宣传的那样,这玩意太耗token了,我的混元和Qwen免费额度几乎都秒爆,GLM也给我一下子烧了一大笔。我觉得这不是我的消费水平该玩的东西……主要我也确实没有什么用OpenClaw赚大钱的好idea。 但是我仍然觉得OpenClaw