1. 为什么要是用多线程
为了 更好的利用多核CPU、为了更快的响应时间(比如发送一个请求,请求立即返回,后台用线程继续处理业务)
2.线程的优先级
优先级越高的线程,获得的CPU执行时间片就越多。偏重计算、需要较多CPU时间的操作设置较低的优先级,因为设置较高优先级之后,导致线程一直占用cpu。针对频繁的阻塞的线程(I/O操作)可以设置较高的线程的优先级,因为这类线程占用CPU较少。
3.守护线程
先调用setDaemon方式使线程变成守护线程再执行start方法。
当Java虚拟机中不存在除Daemon之外的线程,java虚拟机将会退出,可能会导致守护线程的Daemon的finally代码块不会被执行。
4. 线程中断
主要分为:线程执行完之后正常结束和调用线程的interrupt方法。
其中调用interrupt并不会立即中断线程,只是生成一个中断标志,只有在线程阻塞的状态下才会被中断。(调用sleep、join、wait方法进入等待状态),中断的线程会抛出InterruptedException并清除标志位。
5.isInterrupted和interrupted方法对比
isInterrupted判断的是调用此方法的线程,如果设置了线程中断标志,则返回true,并不表示线程真正的被中断。interrupted方法 指的是当前线程,如果设置了线程中断标志,返回true,同时会清除线程中断标志。
6.线程之间的通信
通过volatile关键字修饰共享变量或者使用synchronized修饰同步块和方法。
根据volatile的happend-before原则,volatile的写必须对后续的volatile读内存 可见,也就是说每次写volatile变量的时候,把它刷新到内存,每次读volatile变量的时候都从内存读取。
根据synchronized的happend-before原则,锁的释放happend-before锁的获取,现在在释放锁的时候,会将修改的值刷新到内存。
7. wait和notify使用
wait和notify方法调用之前 必须先获得对象的锁。也就是只能 在同步代码块里面执行。