好的,我来帮你系统梳理 Java 多线程基础,涵盖 Thread 类、线程创建方式、线程池,并附示例,让你快速理解和掌握多线程编程。
Java 多线程基础
1️⃣ 多线程概念
- 线程(Thread):操作系统调度的最小执行单元。
- 进程(Process):程序运行的实体,包含至少一个线程。
- 多线程的优势:
- 提高程序执行效率(尤其是 I/O 密集型任务)
- 提高 CPU 利用率(计算密集型任务需合理使用线程数)
- 支持并发处理,提高响应能力
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️⃣ 线程生命周期
- 新建(NEW) →
new Thread()
- 就绪(RUNNABLE) →
start()
- 运行(RUNNING) → CPU 调度执行
run()
- 阻塞/等待(BLOCKED/WATING/TIMED_WAITING) →
sleep()、wait()、join()
- 终止(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️⃣ 线程安全与同步
- 线程安全问题:
- 多线程同时操作共享变量可能产生 数据竞争
- 解决方案:
synchronized
关键字(方法/代码块)ReentrantLock
显式锁- 原子类
AtomicInteger、AtomicLong
- 线程安全集合
ConcurrentHashMap、CopyOnWriteArrayList
7️⃣ 多线程注意事项
- 避免死锁:
- 线程相互持有锁,造成无限等待
- 避免资源竞争:
- 使用同步机制保护共享资源
- 线程池合理配置:
- 核心线程数、最大线程数、任务队列大小要根据业务调优
- 线程异常处理:
- 异常不会自动传递,需要通过
Future
或UncaughtExceptionHandler
- 异常不会自动传递,需要通过
✅ 总结
- 线程创建方式:
- 继承
Thread
- 实现
Runnable
- 实现
Callable
+Future
- 继承
- 线程池推荐使用:
- 高效复用线程,控制并发
- 线程安全和同步:
- 使用锁或线程安全类保证共享资源安全
- 注意线程生命周期管理:
- 避免死锁、资源竞争、线程泄露
发表回复