Java 多线程详解:概念、生命周期与实战代码示例
Java 应用常需同时执行多任务。本教程带你了解单线程与多线程执行、线程生命周期、同步技术,及演示各概念的实战代码示例。
什么是单线程?
Java 中单线程是最小执行单元。Java 运行时启动应用时创建 用户线程,按需可添加额外用户或 守护线程。守护线程后台运行,不阻止 JVM 退出。
单线程示例:
package demotest; public class GuruThread { public static void main(String[] args) { System.out.println("Single Thread"); } }
单线程执行优势:
- 开销极小——仅维护一个执行上下文。
- 调试和维护简化。
什么是 Java 多线程?
多线程允许两个或更多线程并发运行,最大化 CPU 利用率。线程共享内存空间,上下文切换快、内存占用低。
创建两个并发线程示例:
package demotest; public class GuruThread1 implements Runnable { public static void main(String[] args) { Thread guruThread1 = new Thread("Guru1"); Thread guruThread2 = new Thread("Guru2"); guruThread1.start(); guruThread2.start(); System.out.println("Thread names are following:"); System.out.println(guruThread1.getName()); System.out.println(guruThread2.getName()); } @Override public void run() { // 线程逻辑 } }
多线程优势:
- 非阻塞 UI 与后台处理。
- 韧性——单线程异常不阻止其他线程。
Java 线程生命周期
线程生命周期包含五个不同状态:
- New —— 线程实例化但未启动。
- Runnable —— 线程已启动,就绪待执行。
- Running —— 线程主动执行中。
- Waiting —— 线程挂起等待特定事件。
- Dead —— 线程执行完毕。
关键线程方法
| 方法 | 描述 |
|---|---|
| start() | 开始线程执行;JVM 调用 run()。 |
| sleep(long milliseconds) | 暂停当前线程指定时长。 |
| getName() | 返回线程名称。 |
| setPriority(int newPriority) | 调整线程优先级(1–10)。 |
| yield() | 建议调度器暂停当前线程。 |
实战线程示例
下面简例演示线程创建、优先级调整、睡眠。
package demotest; public class ThreadExample1 implements Runnable { @Override public void run() { // 线程工作 } public static void main(String[] args) { Thread guruThread1 = new Thread(); guruThread1.start(); try { Thread.sleep(1000); // 暂停 1 秒 } catch (InterruptedException e) { e.printStackTrace(); } guruThread1.setPriority(1); System.out.println(guruThread1.getPriority()); System.out.println("Thread Running"); } }
输出示例:
线程同步
多线程访问共享资源时,同步确保数据一致性。Java 用 synchronized 关键字包裹临界区,保证独占访问。
synchronized(object) { // 同步块 }
进阶多线程示例
下面更完整示例创建两线程,各打印名称与计数器,间隔 1 秒。
package demotest; public class GuruThread2 { public static void main(String[] args) { GuruThread3 threadGuru1 = new GuruThread3("guru1"); threadGuru1.start(); GuruThread3 threadGuru2 = new GuruThread3("guru2"); threadGuru2.start(); } } class GuruThread3 implements Runnable { private Thread guruthread; private String guruname; GuruThread3(String name) { this.guruname = name; } @Override public void run() { System.out.println("Thread running " + guruname); for (int i = 0; i < 4; i++) { System.out.println(i); System.out.println(guruname); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Thread has been interrupted"); } } } public void start() { System.out.println("Thread started"); if (guruthread == null) { guruthread = new Thread(this, guruname); guruthread.start(); } } }
典型输出(见附图):
核心收获
- 多线程使应用摆脱阻塞调用,实现并发操作。
- 线程生命周期——New, Runnable, Running, Waiting, Dead——定义线程经历的状态。
- 线程共享数据时同步至关重要,防止竞态条件。
- 实战编码示例强化线程创建、生命周期管理、同步理解。
java
- C++ 函数详解:从声明到调用的实战指南
- C# 集合实战教程:ArrayList、Stack、Queue、Hashtable 等核心类型全解析
- 精通 C++ 多线程编程:高效并发开发实战
- Java Hello World:你的第一个程序
- 精通 Java String.indexOf():定位子字符串与实战示例
- Java String.charAt() 详解:语法、返回类型、异常与实战示例
- 精通 Java String compareTo():语法、用例与实战示例
- Java 构造器重载详解:规则、链式调用与实战代码
- Java 判断素数(质数)的完整指南与代码实现
- Java 插入排序算法详解:核心原理、完整代码与步骤演示
- Java 选择排序详解:核心原理、完整代码与步骤演示
- Java 9 try-with-resources 改进:Effectively-final 变量直接使用