注意当catch语句要捕获多种异常类型时,参数(在这里是e)隐式地成为final变量。
方法声明异常throws,抛出异常throw。
try-with-resources子句(Java SE 7以后)
援引官网的介绍吧:
The try-with-resources statement is a try statement that declares one or more resources. A resource is an object that must be closed after the program is finished with it. The try-with-resources statement ensures that each resource is closed at the end of the statement. Any object that implements java.lang.AutoCloseable, which includes all objects which implement java.io.Closeable, can be used as a resource.
线程
线程是操作系统调度的最小单元,也叫轻量级进程。同一进程可以创建多个线程,而他们都拥有各自的计算器、堆栈和局部变量等属性,并且能够访问共享的内存变量。
线程的5个状态
创建(New):使用new关键字创建一个线程
就绪(Ready):调用start方法,等待CPU调度
运行(Running):执行run方法

阻塞(Blocked):由于一些原因放弃CPU使用权,暂时停止执行
死亡(Dead):run方法执行完毕或者执行时产生异常
几个重要的名词区分
同步和异步
同步方法调用后必须等待方法返回才能执行后续行为;异步方法调用后可以立刻执行后续行为。
并发和并行
并行是真正意义上的多个任务同时执行;并发是支持处理多个任务,不一定要同时,多个任务可能是串行的,但每个任务只能获取CPU很短的占用时间,多个任务在很短的时间内交替执行。
我相信你已经能够得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。
阻塞和非阻塞
阻塞是指某一线程访问一公共资源时其他线程必须等待该线程释放资源才可以使用,否则就要挂起线程等待;非阻塞是指线程之间不会发生资源争夺。
原子性

原子性是指一个操作是不可被中断的,即使多个线程是同时执行的。
可见性
可见性是指当某个线程修改了共享变量的值,其他线程能否立刻知晓。
有序性
Java内存模型中的程序天然有序性可以总结为一句话:如果在本线程内观察,所有操作都是有序的;如果在一个线程中观察另一个线程,所有操作都是无序的。前半句是指“线程内表现为串行语义”,后半句是指“指令重排序”现象和“工作内存和主内存同步延迟”现象。
Java中提供了关键字volatile和synchronized关键字来保证线程之间操作的有序性。volatile包含了禁止指令重排序的语义,并保证不同线程对同一变量操作时的可见性;synchronized关键字对同一时刻同一变量只允许一个线程对其进行lock操作。
线程创建
继承Thread类重写run()方法
匿名内部类,即在new Thread()后跟具体的定义体,其中重写了run()方法
实现Runnable接口,重写run()方法
开启线程的run()和start()方法区别

run()方法不能新建一个线程,而是在当前线程中调用run()方法;
start()方法新建一个线程并调用其run()方法。
终止线程不要使用stop()
一般情况下,线程在执行完毕后就会结束,无需手工关闭,但是我们也经常会创建无限循环的后台进程以持续提供某项服务,所以就需要手动关闭这些线程。
在JDK中也有终止线程的API,例如stop()方法,但是极度不推荐这个方法,因为stop()方法得到调用后,会强行把执行到一半的线程终止,可能会引起数据不一致问题。
但是想要终止一个无限循环的线程应该怎么做?
我们推荐的做法是在类中添加一个isStop的布尔值属性,判断isStop为true则跳出循环体,线程执行完毕自动终止,就避免了数据不一致的问题。
wait() 和notify()
这两个方法不是Thread类特有的,而是所有类的父类Object中的。
当一个对象调用了wait方法后,如:objectA.wait(),当前线程就会在这个对象上等待,会释放该对象的锁,直到其他线程调用了objectA.notify()方法为止。
需要注意的是,wait和notify方法都必须获得对象的监视器(锁),在同步代码得到执行后也会释放对象的锁,所以必须被包含在对象的synchronzied语句中。




