Java线程
线程,是并发编程的基础,操作系统运行的最小单元,进程可以拥有线程,线程也称为轻量级进程,同一进程的线程是可以共享进程的内存的。
线程简介
为什么要使用线程?冯诺依曼运算体系,目前没啥大的突破,处理器不断升级,升级频率,升级内核数量,更快的响应的,提供更好的并发编程模型。
在Java中,线程是有优先级的,似乎很少提及,Thread设置后,操作系统可能不买账。
线程的状态,new、Runnable、Blocked、Waiting、Time_waiting、Terminated。
Daemon线程,如果Java虚拟机中不存在Daemon线程,则会退出。Daemon属性要在启动线程前设置,否则无效。
线程启动运行
创建线程,可以通过继承Thread类和实现Runnable接口,提供多样的构造函数,设置线程组,优先级,线程名以及ThreadLocalMap。
start方法启动线程,然后等待操作系统调度并执行run方法。
中断,interrupt()/中断位,可以理解线程有一个标识位,表示运行中的线程是否被其他线程进行了中断操作。线程通过检查自身是否被中断来进行响应,isInterrupted方法判断是否被中断。
在Java API中,有许多声明了抛出InterruptedException的方法,这些方法抛出异常之前,Java虚拟机先将该线程的中断位清除,然后抛出异常,所以抛出异常后,isInterrupted是返回的false。
Thread还有几个过期的方法,suspend,resume和stop方法,方法调用后,不会释放占有的资源(如锁),会导致程序不稳定,抛弃。
如果安全地终止线程?中断,合理的设置boolean变量控制。
线程间通信
volatile / synchronized / Lock,volatile保证内存可见性,synchronized,保证代码在同一时刻,只能有一个线程运行,排他性。
Java的父类Object提供等待/通知(唤醒)机制wait()/notify(),配合synchronized使用,进行同步控制。
等待方:
- 获取对象锁
- 如果条件不满足,调用对象的wait方法,被通知后仍要检查条件。
- 条件满则则执行对应的逻辑。
通知方:
- 获取对象的锁
- 改变条件
- 通知(所有)等待在对象上的线程
ThreadLocal,线程变量,空间换取时间,对于一些公共类,并且是非线程安全的,可以考虑使用。