好的,我来帮你系统梳理 Java 多线程基础,涵盖 Thread 类、线程创建方式、线程池,并附示例,让你快速理解和掌握多线程编程。


Java 多线程基础

1️⃣ 多线程概念

  • 线程(Thread):操作系统调度的最小执行单元。
  • 进程(Process):程序运行的实体,包含至少一个线程。
  • 多线程的优势
    1. 提高程序执行效率(尤其是 I/O 密集型任务)
    2. 提高 CPU 利用率(计算密集型任务需合理使用线程数)
    3. 支持并发处理,提高响应能力

2️⃣ 线程创建方式

2.1 继承 Thread 类

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 正在运行");
    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();  // 启动线程,调用 run() 方法
    }
}

注意

  • start() 启动新线程,执行 run() 方法
  • 直接调用 run() 只是普通方法调用,不会开启新线程

2.2 实现 Runnable 接口

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 正在运行");
    }
}

public class RunnableDemo {
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();
    }
}

优点

  • 避免单继承限制
  • 适合多个线程共享同一任务对象

2.3 使用 Callable + Future(可返回结果的线程)

import java.util.concurrent.*;

class MyTask implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        return 123;
    }
}

public class CallableDemo {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Integer> future = executor.submit(new MyTask());
        System.out.println("任务结果: " + future.get());
        executor.shutdown();
    }
}


3️⃣ 线程生命周期

  1. 新建(NEW) → new Thread()
  2. 就绪(RUNNABLE) → start()
  3. 运行(RUNNING) → CPU 调度执行 run()
  4. 阻塞/等待(BLOCKED/WATING/TIMED_WAITING) → sleep()、wait()、join()
  5. 终止(TERMINATED) → run() 执行完成

4️⃣ 线程常用方法

方法说明
start()启动线程
run()线程执行体
sleep(long millis)线程休眠,不释放锁
join()等待线程结束
yield()暂停当前线程,给其他线程机会
setPriority()设置线程优先级(1~10)
isAlive()判断线程是否存活

5️⃣ 线程池(推荐使用)

5.1 线程池概念

  • 线程池(ThreadPool):提前创建一定数量线程,复用线程执行任务
  • 优点
    • 避免线程频繁创建销毁开销
    • 控制并发线程数,提高资源利用率
    • 可管理任务队列和执行策略

5.2 使用 Executors 创建线程池

import java.util.concurrent.*;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3); // 固定 3 个线程
        for (int i = 0; i < 5; i++) {
            int taskId = i;
            executor.submit(() -> {
                System.out.println(Thread.currentThread().getName() + " 执行任务 " + taskId);
            });
        }
        executor.shutdown(); // 关闭线程池
    }
}

5.3 常用线程池类型

类型说明
FixedThreadPool固定线程数,适合稳定并发量
CachedThreadPool根据需要创建线程,适合短生命周期任务
SingleThreadExecutor单线程顺序执行任务
ScheduledThreadPool支持定时/周期任务

6️⃣ 线程安全与同步

  • 线程安全问题
    • 多线程同时操作共享变量可能产生 数据竞争
  • 解决方案
    1. synchronized 关键字(方法/代码块)
    2. ReentrantLock 显式锁
    3. 原子类 AtomicInteger、AtomicLong
    4. 线程安全集合 ConcurrentHashMap、CopyOnWriteArrayList

7️⃣ 多线程注意事项

  1. 避免死锁
    • 线程相互持有锁,造成无限等待
  2. 避免资源竞争
    • 使用同步机制保护共享资源
  3. 线程池合理配置
    • 核心线程数、最大线程数、任务队列大小要根据业务调优
  4. 线程异常处理
    • 异常不会自动传递,需要通过 Future 或 UncaughtExceptionHandler

✅ 总结

  • 线程创建方式
    • 继承 Thread
    • 实现 Runnable
    • 实现 Callable + Future
  • 线程池推荐使用
    • 高效复用线程,控制并发
  • 线程安全和同步
    • 使用锁或线程安全类保证共享资源安全
  • 注意线程生命周期管理
    • 避免死锁、资源竞争、线程泄露