1. 线程的创建方式手写必备面试官问“有几种方式”标准答案是4种继承 Thread 类重写run()方法。缺点是Java单继承继承了Thread就不能继承别的类了。实现 Runnable 接口实现run()方法。最常用推荐。实现 Callable 接口带返回值的线程需要配合FutureTask类获取异步执行结果还能抛出异常。线程池Executors / ThreadPoolExecutor实际项目中的唯一正确途径。避免频繁创建和销毁线程消耗资源。核心参数核心线程数、最大线程数、队列、拒绝策略这是另一大面试重点。2. 线程的6种生命周期状态状态机Java的Thread.State定义了 6 种状态就像人的一生NEW新建刚new出来还没调用start()相当于婴儿刚出生。RUNNABLE可运行调用了start()正在 CPU 上跑或者正等 CPU 分配时间片正在努力打工。BLOCKED阻塞等锁比如你想上厕所但是厕所有人没有获取到synchronized锁。WAITING无限期等待调用了wait()或join()。主动在休息室长凳上睡觉除非别人notify()叫醒你否则一直睡。TIMED_WAITING限期等待调用了sleep(带时间)。定了闹钟的睡觉时间到了自动醒。TERMINATED终止代码执行完了或者出异常退出了游戏结束。3. 经典的锁机制初探synchronized vs ReentrantLock对比点synchronizedReentrantLock本质Java 关键字JVM 层面实现Java API 层面的类 (AQS实现)释放锁自动释放发生异常也会自动释放必须在finally中手动unlock()释放灵活性较低上锁就死等极高支持尝试拿锁、公平锁、中断等待公平性非公平锁可选公平或非公平默认非公平什么时候用简单场景无脑用synchronizedJDK1.6后优化了偏向锁、轻量级锁性能不差复杂并发控制需响应中断、尝试加锁等用ReentrantLock。4. 线程通信机制wait() / notify()必须在synchronized块中调用wait() 会释放锁当前线程进入休眠。sleep() 不会释放锁抱枕头死睡这是高频坑点。CountDownLatch / CyclicBarrierJUC包下的并发工具类。比如“等5个线程都执行完主线程再汇总结果”使用CountDownLatch.await()。
【Java面试必考】多线程基础速通:创建方式、锁机制、状态转换与线程通信
1. 线程的创建方式手写必备面试官问“有几种方式”标准答案是4种继承 Thread 类重写run()方法。缺点是Java单继承继承了Thread就不能继承别的类了。实现 Runnable 接口实现run()方法。最常用推荐。实现 Callable 接口带返回值的线程需要配合FutureTask类获取异步执行结果还能抛出异常。线程池Executors / ThreadPoolExecutor实际项目中的唯一正确途径。避免频繁创建和销毁线程消耗资源。核心参数核心线程数、最大线程数、队列、拒绝策略这是另一大面试重点。2. 线程的6种生命周期状态状态机Java的Thread.State定义了 6 种状态就像人的一生NEW新建刚new出来还没调用start()相当于婴儿刚出生。RUNNABLE可运行调用了start()正在 CPU 上跑或者正等 CPU 分配时间片正在努力打工。BLOCKED阻塞等锁比如你想上厕所但是厕所有人没有获取到synchronized锁。WAITING无限期等待调用了wait()或join()。主动在休息室长凳上睡觉除非别人notify()叫醒你否则一直睡。TIMED_WAITING限期等待调用了sleep(带时间)。定了闹钟的睡觉时间到了自动醒。TERMINATED终止代码执行完了或者出异常退出了游戏结束。3. 经典的锁机制初探synchronized vs ReentrantLock对比点synchronizedReentrantLock本质Java 关键字JVM 层面实现Java API 层面的类 (AQS实现)释放锁自动释放发生异常也会自动释放必须在finally中手动unlock()释放灵活性较低上锁就死等极高支持尝试拿锁、公平锁、中断等待公平性非公平锁可选公平或非公平默认非公平什么时候用简单场景无脑用synchronizedJDK1.6后优化了偏向锁、轻量级锁性能不差复杂并发控制需响应中断、尝试加锁等用ReentrantLock。4. 线程通信机制wait() / notify()必须在synchronized块中调用wait() 会释放锁当前线程进入休眠。sleep() 不会释放锁抱枕头死睡这是高频坑点。CountDownLatch / CyclicBarrierJUC包下的并发工具类。比如“等5个线程都执行完主线程再汇总结果”使用CountDownLatch.await()。