第六部分:异常处理
处理异常:try - catch - finally
抛出异常:throws,throw
throws与throw这两个关键字接近,不过意义不一样,有如下区别:
1. throws 出现在方法声明上,而throw通常都出现在方法体内。
2. throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象
异常分类:
1、可查异常CheckedException,如果不处理,编译器不让通过
2、非可查异常(运行时异常RuntimeException、错误Error)
Throwable类:Exception和Error都继承了该类。所以在捕捉的时候,也可以使用Throwable进行捕捉。异常分Error和Exception,Exception里又分运行时异常和可查异常
自定义异常:继承自Exception
抛出自定义异常
第七部分:I/O
第八部分:Lambda
基本使用
方法引用
聚合操作
第九部分:多线程
三种实现方式:继承线程类、Runnable接口、匿名类
常见线程方法
sleep 当前线程暂停
join 加入到当前线程中
setPriority 线程优先级
yield 临时暂停
setDaemon 守护线程
线程同步
线程安全集合
死锁
线程交互:Object方法,wait、notify和notifyAll。需要结合synchronized使用
线程池:类似生产者消费者,消费的对象是一个个能够运行的任务
1. 准备一个任务容器
2. 一次性启动10个 消费者线程
3. 刚开始任务容器是空的,所以线程都wait在上面。
4. 直到一个外部线程往这个任务容器中扔了一个“任务”,就会有一个消费者线程被唤醒notify
5. 这个消费者线程取出“任务”,并且执行这个任务,执行完毕后,继续等待下一次任务的到来。
6. 如果短时间内,有较多的任务加入,那么就会有多个线程被唤醒,去执行这些任务。
Lock对象
原子访问