Java 提供了三种创建线程的方法:
- 通过实现 Runnable 接口;
- 通过继承 Thread 类本身;
- 通过 Callable 和 Future 创建线程(使用 FutureTask 类来包装 Callable 对象),和Runnable 比多了返回功能,包括结果和异常。
三种总结:
-
1、线程实现Runnable或实现Callable接口,还可以继承其他类。
2、实现接口方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。
3、继承Thread类的线程类不能再继承其他父类(Java单继承决定)
-
一般采用接口创建线程。
一个线程的生命周期的状态:新建,可执行,执行中,阻塞(包括等待阻塞,同步阻塞和其他阻塞,如调用sleep() 或 join()),终止。
常见线程监控器:jvisualvm,jstack,jmc。其中jmc功能较多。
并发三原则:原子性,可见性,有序性。指令重排不会影响单个线程的执行,但是会影响到线程并发执行的正确性。
volatile:保证了可见性和有序性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。操作是原子的才能保证是原子性。
CPU缓存一致性协议MESI,相当于乐观锁的version。嗅探机制做到观察模式,CPU乱序执行。