Java多线程入门(上):从零认识线程,三种创建方式与常用方法 📅 发布时间:2026/7/7 7:01:54 👁️ 浏览次数: Java多线程入门上从零认识线程三种创建方式与常用方法想象一下每年春节你和几百万人在12306上抢票。如果网站只有一个工作人员单线程在处理所有人的请求那画面太美不敢看——你得排到元宵节才能买到票。而多线程就像是同时开了几十个售票窗口大家各抢各的效率直接起飞。这就是多线程的魅力。一、什么是多线程它到底有什么好处通俗地说线程是程序里的一条执行路径。你平时写的代码默认都是在main方法里从上往下执行的这就是单线程。而多线程就是在一个程序里同时跑多条执行路径它们互不干扰或者说看起来互不干扰共同完成复杂的任务。为什么要用多线程提高程序效率把大任务拆成小任务多个线程并行执行减少等待时间提升用户体验比如下载文件时一个线程负责下载一个线程负责更新进度条界面不会卡死充分利用CPU资源现代电脑都是多核CPU单线程只能用一个核多线程才能把所有核心都跑起来。生活例子你去银行办业务。单线程 只有一个柜台开放所有人排队多线程 同时开放多个柜台大家并行办理。12306 抢票就是最经典的例子——如果只有一个线程处理全国人民的请求服务器早炸了。二、创建线程的三种方式Java 中创建线程主要有三种方式我们由浅入深逐个讲解。注意启动线程必须使用start()方法而不是直接调用run()。方式一继承 Thread 类这是最简单粗暴的方式写一个类继承Thread重写run()方法把你要做的事写进去。packageduoxiancheng;/** * 继承 Thread 类创建线程 */classMyThreadextendsThread{Overridepublicvoidrun(){for(inti0;i5;i){System.out.println(子线程执行第 i 次);}}}publicclassThreadDemo1{publicstaticvoidmain(String[]args){// 创建线程对象MyThreadtnewMyThread();// 启动线程注意调用 start()不是 run()t.start();// 主线程的任务for(inti0;i5;i){System.out.println(主线程执行第 i 次);}}}运行结果每次可能不一样因为线程是并发执行的⚠️ 重点start() 和 run() 的区别start()告诉 JVM 开启一个新线程新线程会单独执行run()里的代码这才是真正的多线程。run()如果直接调用run()那就跟调用普通方法一样代码还是在当前线程里顺序执行没有开启新线程。// ❌ 错误示范直接调用 run()相当于还是单线程执行t.run();// ✅ 正确示范调用 start()JVM 会开启新线程执行 run() 里的逻辑t.start();❌ 这种方式的缺点Java 是单继承语言一旦你extends Thread就不能再继承其他类了。这在实际开发中非常不灵活所以这种方式不推荐。方式二实现 Runnable 接口既然继承不灵活那就用实现接口的方式。写一个类实现Runnable接口重写run()方法然后把对象传给Thread的构造器这里有一个容易忽视的点就是Thread类实现了Runnable接口packageduoxiancheng;/** * 实现 Runnable 接口创建线程 */classMyRunnableimplementsRunnable{Overridepublicvoidrun(){for(inti0;i5;i){System.out.println(子线程执行第 i 次);}}}publicclassThreadDemo2{publicstaticvoidmain(String[]args){// 1. 创建 Runnable 任务对象MyRunnabletasknewMyRunnable();// 2. 把任务交给 Thread 线程对象ThreadtnewThread(task);// 3. 启动线程t.start();// 主线程的任务for(inti0;i5;i){System.out.println(主线程执行第 i 次);}}}进阶写法匿名内部类如果你不想专门写一个类可以用匿名内部类简化packageduoxiancheng;publicclassThreadDemo3{publicstaticvoidmain(String[]args){// 使用匿名内部类创建 Runnable 对象ThreadtnewThread(newRunnable(){Overridepublicvoidrun(){for(inti0;i5;i){System.out.println(子线程执行第 i 次);}}});t.start();// 主线程的任务for(inti0;i5;i){System.out.println(主线程执行第 i 次);}}}关键理解Runnable 本质上就是一个任务描述书。Thread 才是真正的工人。你把任务书交给工人工人按照任务书去干活。这种方式解耦了任务和执行者比继承 Thread 灵活得多。❌ 以上两种方法的共同缺点Thread和Runnable的run()方法都没有返回值也不能抛出受检异常。如果你希望线程执行完后返回一个结果这两种方式都做不到。方式三实现 Callable 接口直接创建线程时功能最强Callable 是 JDK 5 引入的可以说是直接创建线程时功能最强的选择。它的call()方法既能返回值也能抛出异常。而且后文我们要讲的线程池接收的主要就是Callable和Runnable类型的任务。不过Callable 不能直接与 Thread 挂钩需要通过FutureTask进行中转。packageduoxiancheng;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.FutureTask;/** * 实现 Callable 接口创建线程 */classMyCallableimplementsCallableString{OverridepublicStringcall()throwsException{intsum0;for(inti1;i100;i){sumi;}return计算完毕1到100的和是sum;}}publicclassThreadDemo4{publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{// 1. 创建 Callable 任务对象MyCallablecallablenewMyCallable();// 2. 把 Callable 封装成 FutureTaskFutureTask 本质上就是一个 RunnableFutureTaskStringfutureTasknewFutureTask(callable);// 3. 把 FutureTask 交给 ThreadThreadtnewThread(futureTask);// 4. 启动线程t.start();// 5. 获取线程执行完毕后的结果如果线程还没执行完这里会阻塞等待StringresultfutureTask.get();System.out.println(result);}}为什么需要 FutureTaskFutureTask本质上是一个Runnable 线程任务对象所以它可以交给Thread去执行。同时它又包装了Callable因此可以通过get()方法获取线程执行完毕后的返回值。你可以把它理解成一个双料间谍对外表现成 Runnable能交给 Thread对内封装了 Callable能拿到返回值。⚠️注意futureTask.get()是一个阻塞方法。如果子线程还没执行完主线程会在这一句一直等直到子线程返回结果。 先别急着兴奋Callable 确实比前两种方式强大但正如后文线程池部分会详细讲到的在实际项目开发中我们很少直接new Thread()而是把 Callable 或 Runnable 任务提交给线程池去执行。现在先掌握它的用法即可。三、线程的六大状态生命周期线程从创建到死亡会经历不同的状态。理解这些状态能帮你更好地排查线程卡死、线程不执行等问题。状态说明NEW新建状态。线程刚被创建还没调用start()。RUNNABLE可运行状态。调用了start()线程正在运行或等待CPU调度。BLOCKED阻塞状态。线程试图获取一个锁但锁被别的线程占用了。WAITING无限等待状态。线程调用了wait()或join()且无超时需要被唤醒。TIMED_WAITING限时等待状态。线程调用了sleep(时间)或join(时间)时间到自动恢复。TERMINATED终止状态。线程执行完毕或异常退出。packageduoxiancheng;publicclassThreadStateDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{ThreadtnewThread(()-{try{Thread.sleep(100);// 进入 TIMED_WAITING}catch(InterruptedExceptione){e.printStackTrace();}});System.out.println(新建后t.getState());// NEWt.start();System.out.println(启动后t.getState());// RUNNABLE或 TIMED_WAITINGThread.sleep(10);// 让主线程稍等确保子线程进入 sleepSystem.out.println(子线程睡眠中t.getState());// TIMED_WAITINGt.join();// 等待子线程执行完毕System.out.println(子线程结束后t.getState());// TERMINATED}}重要结论线程进入BLOCKED、WAITING、TIMED_WAITING状态时都会让出 CPU不会一直占着资源。四、线程的常用方法与构造器常用方法方法说明run()线程要执行的逻辑直接调用不会开启新线程。start()启动线程让 JVM 调度执行run()。getName()获取线程名字默认是Thread-0、Thread-1这种格式。setName(String name)给线程起个自定义名字方便排查问题。Thread.currentThread()获取当前正在执行的线程对象。sleep(long millis)让当前线程休眠指定毫秒进入TIMED_WAITING。join()让当前线程等待调用者线程执行完毕再继续执行。常见构造器// 1. 给线程起个名字Threadt1newThread(下载线程-A);// 2. 传入 Runnable 任务Threadt2newThread(newMyRunnable());// 3. 传入 Runnable 任务同时起名字最常用Threadt3newThread(newMyRunnable(),下载线程-B);代码演示packageduoxiancheng;publicclassThreadMethodDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{ThreadtnewThread(()-{System.out.println(子线程名字Thread.currentThread().getName());try{Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(子线程执行完毕);},我的工作线程);t.start();// 主线程等待子线程执行完毕t.join();System.out.println(主线程继续执行);}}写在最后作为初学者你只需要记住这三条核心结论创建线程有三种方式继承 Thread不推荐、实现 Runnable无返回值、实现 Callable有返回值直接创建时功能最强启动线程一定用start()直接调用run()就是普通方法线程有六大状态其中BLOCKED、WAITING、TIMED_WAITING都会让出 CPU。当然光是创建线程还不够。当多个线程同时操作同一份数据时就会引出线程安全问题——这也是中篇要重点讲的线程同步与锁机制。
PyTorch MPS 后端实战:Mac M1 芯片 MNIST 训练 6 倍加速与 Tesla P100 对比 PyTorch MPS 后端深度评测:Mac M1 芯片在 MNIST 训练中的性能突破与硬件对比当苹果首次推出 M1 芯片时,整个技术社区都在猜测这款 ARM 架构芯片能否真正胜任专业级计算任务。如今,随着 PyTorch 官方对 MPS(Metal Performance Shad… 2026/7/7 7:01:54
光谱仪设计实战:Zemax中系统孔径与焦距对衍射极限分辨率的2个影响 光谱仪设计实战:Zemax中系统孔径与焦距对衍射极限分辨率的深度解析当一束白光穿过棱镜时,我们会看到彩虹般的光谱展开——这是光学中最迷人的现象之一。而现代光谱仪将这一原理推向极致,成为科研和工业中不可或缺的分析工具。作为光学工程师&… 2026/7/7 6:59:53
Windows HEIC格式转换终极指南:用HEIF Utility轻松解决iPhone照片兼容问题 Windows HEIC格式转换终极指南:用HEIF Utility轻松解决iPhone照片兼容问题 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 你是否曾遇到过这样的困扰… 2026/7/7 6:59:53
孤能子视角:智谱清言对"扩散模型与EIS关系场耦合"点评追补观点 (顺看智谱清言GLM-5.2对关系性动力学的运用能力) 孤能子视角:扩散模型与EIS关系场耦合——分析点评点评基调:本次分析是一次极具理论勇气且系统严密的“EIS理论映射实验”。它成功将2026年扩散模型的前沿进展统摄于EIS(关系场智能理论&#x… 2026/7/7 8:24:15
如何3分钟永久保存你的QQ空间记忆:GetQzonehistory完整备份指南 如何3分钟永久保存你的QQ空间记忆:GetQzonehistory完整备份指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想找回那些消失在时光中的QQ空间记忆?那… 2026/7/7 8:24:15
3步掌握pymoo多目标决策实战指南:从Pareto前沿到最优解选择 3步掌握pymoo多目标决策实战指南:从Pareto前沿到最优解选择 【免费下载链接】pymoo NSGA2, NSGA3, R-NSGA3, MOEAD, Genetic Algorithms (GA), Differential Evolution (DE), CMAES, PSO 项目地址: https://gitcode.com/gh_mirrors/py/pymoo pymoo是Python生… 2026/7/7 8:22:15
TVA在具身智能的创新应用案例(10) 前沿技术介绍:AI智能体视觉(TVA,Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术,属于“物理AI” 领域的一种全新技术形态,完成了从“虚拟世界”到“… 2026/7/7 8:22:15
2026好用在线图片视频去水印网站:免费无广告工具优缺点对比 在日常个人素材整理、学习资料收藏的过程中,图片、短视频自带的水印、logo、文字遮挡,往往会影响素材的观感和使用体验。很多用户在挑选去水印工具时,都会陷入两难:客户端软件需要下载安装、占用设备内存,普通网页工具… 2026/7/7 8:22:15
Conda从入门到精通的环境管理实战 Conda 完全指南:从入门到精通的环境管理实战 本文系统梳理 Conda 的核心概念、安装配置、环境管理以及与现代 IDE 的整合方案,适用于数据科学、深度学习及多项目 Python 开发场景。 目录 什么是 CondaConda 的两大核心功能Conda vs Pip:如何… 2026/7/7 8:18:14
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/6 8:43:22
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/6 7:29:49
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/6 7:29:51