1. 何为异常?为什么要进行异常处理?
何为异常?
异常是指程序运行过程中发生的非正常情况或错误。Java中,异常是一种对象,用来描述错误或意外情况,所有异常类继承自java.lang.Throwable
,主要分为Error(错误)和Exception(异常)。
为什么要进行异常处理?
- 保证程序稳定性:防止程序因异常而崩溃。
- 分离逻辑与处理:让代码更清晰、可维护。
- 提供调试信息:便于定位问题,通过异常堆栈跟踪分析错误。
- 增强用户体验:提供友好提示,而非直接终止程序。
- 应对外部环境:处理文件、网络等不可控问题,确保程序运行可靠。
2. Error和Exception类有什么不同?
- Error和Exception都继承自
Throwable
,但含义和用法不同。 - Error:
- 表示系统级别的错误(如内存溢出
OutOfMemoryError
、栈溢出StackOverflowError
)。 - 通常由JVM引发,不可恢复,不建议捕获处理。
- 表示系统级别的错误(如内存溢出
- Exception:
- 表示程序级别的异常(如
IOException
、NullPointerException
)。 - 可分为受检异常(Checked Exception,必须显式处理)和非受检异常(Unchecked Exception)。
- 开发者可以通过
try-catch
处理。
- 表示程序级别的异常(如
- 主要区别:
- Error是系统错误,无法恢复;Exception是程序错误,可恢复。
- Error不需捕获;Exception需根据情况捕获处理。
3. 如何建立多线程?
- 继承Thread类
- 创建一个类继承
Thread
类,重写run()
方法,然后通过start()
方法启动线程。
- 创建一个类继承
- 实现Runnable接口
- 创建一个类实现
Runnable
接口,重写run()
方法,将其传入Thread
对象,通过start()
方法启动线程。
- 创建一个类实现
- 使用Lambda表达式
- 使用
Runnable
接口的函数式编程特性,通过Lambda表达式简化线程创建。
- 使用
- 实现Callable接口
- 实现
Callable
接口,重写call()
方法,使用FutureTask
包装后,通过Thread
启动线程。
- 实现
- 使用线程池
- 使用
ExecutorService
或Executors
创建线程池,提交任务执行并管理线程。
- 使用
4. 线程的生命周期有哪几种状态?各状态之间分别用哪些方法切换?
Java线程的生命周期状态及切换方法:
- 新建状态(New)
- 描述:线程对象被创建,尚未调用
start()
方法。 - 切换方法:调用
start()
方法,进入就绪状态。
- 描述:线程对象被创建,尚未调用
- 就绪状态(Runnable)
- 描述:线程调用
start()
方法后,等待CPU调度,具备运行条件但未运行。 - 切换方法:
- 被CPU调度,进入运行状态。
- 描述:线程调用
- 运行状态(Running)
- 描述:线程获取CPU时间片,开始执行
run()
方法。 - 切换方法:
- 调用
yield()
方法,进入就绪状态。 - 执行完成或抛出异常,进入终止状态。
- 调用
wait()
、sleep()
或等待锁,进入阻塞/等待状态。
- 调用
- 描述:线程获取CPU时间片,开始执行
- 阻塞/等待状态(Blocked/Waiting/Timed Waiting)
- 描述:线程因某些操作被阻塞或主动等待,暂时无法运行。
- 阻塞状态:等待获取锁(如
synchronized
)。 - 等待状态:调用
wait()
、join()
等方法。 - 超时等待状态:调用
sleep()
或wait(timeout)
等方法。
- 阻塞状态:等待获取锁(如
- 切换方法:
- 阻塞状态:获取锁后,进入就绪状态。
- 等待状态:被
notify()
、notifyAll()
唤醒或时间到期,进入就绪状态。
- 描述:线程因某些操作被阻塞或主动等待,暂时无法运行。
- 终止状态(Terminated)
- 描述:线程执行完成或因未捕获异常而结束。
- 切换方法:线程生命周期结束,无法再切换到其他状态。
总结状态转换:
- 新建 → 就绪:调用
start()
。 - 就绪 → 运行:CPU调度。
- 运行 → 就绪:调用
yield()
。 - 运行 → 阻塞/等待:调用
wait()
、sleep()
或获取不到锁。 - 阻塞/等待 → 就绪:获取锁或被唤醒。
- 运行 → 终止:执行完成或抛出异常。
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!
0 条评论