Java线程:从青铜到王者的必修课(附实战代码)
在月薪过万的Java工程师面试中,线程问题是必考的重灾区。本文用15分钟带你掌握线程核心知识,文末附赠「高并发场景优化指南」!
一、为什么线程是Java程序员的分水岭?
- 性能提升:单核CPU实现网页多标签同时加载
- 资源利用:数据库连接池复用技术背后的秘密
- 用户体验:微信消息接收和输入同时进行的奥秘
二、线程 vs 进程:快递站的精妙比喻
维度 | 进程 | 线程 |
资源开销 | 独立内存空间(500MB起) | 共享内存(1MB内) |
切换成本 | 需要切换页表(高) | 仅切换程序计数器(低) |
通信方式 | Socket/管道(慢) | 共享变量(快) |
三、线程生命周期全景图
java
// 典型状态转换示例
new Thread(() -> {
synchronized(lock) { // BLOCKED状态
try {
Thread.sleep(1000); // TIMED_WAITING
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 处理中断
}
}
}).start();
四、3种创建方式终极选择指南
- 继承Thread类:适合简单场景
- java
- class MyThread extends Thread { public void run() { System.out.println("Thread启动!"); } }
- 实现Runnable接口(推荐):避免单继承限制
- java
- new Thread(() -> System.out.println("Lambda表达式更简洁")).start();
- Callable+Future:需要返回值时使用
- java
- FutureTask<Integer> task = new FutureTask<>(() -> { Thread.sleep(2000); return 42; }); new Thread(task).start(); System.out.println(task.get()); // 阻塞获取结果
五、线程安全三大终极解决方案
- 同步监视器(synchronized)
- java
- // 双重校验锁单例模式 public class Singleton { private volatile static Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
- Lock显式锁(更灵活)
- java
- ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // 临界区代码 } finally { lock.unlock(); }
- 原子类(性能最优)
- java
- AtomicInteger count = new AtomicInteger(); count.incrementAndGet(); // 线程安全的自增
六、线程池的七大参数详解
java
ExecutorService pool = new ThreadPoolExecutor(
5, // 核心线程数(常驻员工)
10, // 最大线程数(临时工上限)
60L, TimeUnit.SECONDS, // 闲置时间
new LinkedBlockingQueue<>(100), // 任务队列(候客区)
Executors.defaultThreadFactory(), // 线程创建工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
七、典型应用场景
- 电商秒杀:1000人同时抢100件商品
- 文件批量处理:同时转换100个PDF文档
- 监控系统:每秒采集100台服务器指标
高频面试题精选
- sleep()和wait()有什么区别?
- 如何优雅地停止线程?
- ThreadLocal会引发内存泄漏吗?
上一篇:for循环进阶攻略