Thread<br>
创建方式
实现Callable
如果需要返回值,使用Callable
守护线程
守护线程是一个服务线程,没有服务对象就没有必要运行了<br>
在线程启动前设置为守护线程,setDaemon(boolean on)<br>
守护线程中创建的线程,也是守护线程
优先级
优先级高,仅仅表示获取时间片的几率高,并不是一个确定因素<br>
高度依赖操作系统<br>
方法
sleep()<br>
调用sleep()会进入计时等待状态,时间到了的话,就会进入就绪状态,而非运行状态<br>
yield()<br>
先让别的线程执行,但不一定真的让出<br>
join()<br>
等待该线程执行完毕后才执行别的线程<br>
interrupt()<br>
不会真的停止线程,而是发出一个终止的信号,告诉它改结束了<br>
仅仅是一个状态标识位
静态方法interrupt(),会清除中断标识位<br>
实例方法IsInterrupt(),不会清除中断标识位<br>
Atomic<br>
原子类可分为4种类型:基本数据类型、数组、引用类型、对象的属性
解决ABA问题可以使用AtomicStampedReference和AtomicMarkableReference类<br>
LongAdder性能比AtomicLong要好<br>
ThradLocal
ThreadLocal存储的变量属于当前线程,该变量对其他线程而言是不可见的
Thread为每个线程维护了ThreadLocalMap这么一个Map,而ThreadLocalMap的key是ThreadLocal对象本身,value则是要存储的对象<br>
内存泄漏是因为key是一个弱引用,value是一个强引用,当发生GC时,key会被会后,就会产生一个null的key和value值得map,一直回收不了<br>
想要避免内存泄露就要手动remove()掉<br>
ThreadLocal设计的目的就是为了能够在当前线程中有属于自己的变量,并不是为了解决并发或者共享变量的问题