一条龙看下来,加深 你对多线程的理解 和 实际运用能力。
简介
Java 的多线程是 Java 平台的核心特性之一,它允许并发执行多个任务,从而提高程序的响应能力和整体性能。Java 多线程主要通过 Thread
类和 Runnable
接口来实现。下面详细介绍 Java 多线程的基本概念、实现方式、生命周期、同步机制等方面的知识。
1. Java 多线程的基本概念
1.1 线程与进程
- 进程:是操作系统分配资源的基本单位,每个进程都有独立的内存空间。
- 线程:是进程内的一个执行单元,同一进程中的线程共享进程的内存空间,线程间的通信更为高效。
1.2 线程的好处
- 提高系统响应性:可以实现用户界面与后台处理的并发执行,使得程序即使在处理耗时操作时也能保持响应。
- 提高性能:充分利用多核处理器的能力,同时处理多个任务。
2. 创建线程的两种方式
2.1 继承 Thread
类
可以通过继承 Thread
类并重写 run()
方法来创建线程。
1class MyThread extends Thread {
2 @Override
3 public void run() {
4 System.out.println("Thread running...");
5 }
6
7 public static void main(String[] args) {
8 MyThread thread = new MyThread();
9 thread.start(); // 启动线程
10 }
11}
2.2 实现 Runnable
接口
也可以实现 Runnable
接口,并将其实例作为参数传递给 Thread
的构造函数。
1class MyRunnable implements Runnable {
2 @Override
3 public void run() {
4 System.out.println("Runnable running...");
5 }
6
7 public static void main(String[] args) {
8 Thread thread = new Thread(new MyRunnable());
9 thread.start();
10 }
11}
3. 线程的生命周期
线程的生命周期包括以下几个阶段:
- 新建 (
NEW
):当一个线程对象被创建但尚未启动时。 - 就绪 (
RUNNABLE
):线程被启动后,等待 CPU 时间片。 - 运行 (
RUNNABLE
):线程获得了 CPU 时间片并开始执行。 - 阻塞 (
BLOCKED
):线程因等待某种条件(如 I/O 操作或同步锁)而暂时停止运行。 - 等待/休眠 (
WAITING
):线程因等待特定事件的发生(如wait()
方法)而暂停运行。 - 定时等待 (
TIMED_WAITING
):线程因等待一定时间(如sleep()
方法)而暂停运行。 - 终止 (
TERMINATED
):线程执行完毕或被异常终止。
4. 线程同步
4.1 同步锁
为了保证多线程环境下对共享资源的正确访问,可以使用同步锁(Synchronized)来保护临界区。
1public class Counter {
2 private int count = 0;
3
4 public synchronized void increment() {
5 count++;
6 }
7
8 public synchronized int getCount() {
9 return count;
10 }
11}
4.2 volatile 关键字
volatile
关键字可以用来标记一个变量是共享的,确保了对变量的可见性和禁止指令重排。
1public class Counter {
2 private volatile int count = 0;
3
4 public void increment() {
5 count++;
6 }
7
8 public int getCount() {
9 return count;
10 }
11}
4.3 Lock 接口
Lock
接口提供了更灵活的锁定机制,可以实现更复杂的同步策略。
1import java.util.concurrent.locks.Lock;
2import java.util.concurrent.locks.ReentrantLock;
3
4public class Counter {
5 private int count = 0;
6 private final Lock lock = new ReentrantLock();
7
8 public void increment() {
9 lock.lock();
10 try {
11 count++;
12 } finally {
13 lock.unlock();
14 }
15 }
16
17 public int getCount() {
18 return count;
19 }
20}