1、了解进程与线程
cpu核心数和线程数的关系
最早是一块cpu上只有一个核心数, 一般核心数与线程是1:1, 但Inter引入了多线程的概念,
核心数与线程就变成了1:2的关系
cpu时间片轮转机制
CPU执行一条指令,大约花费0.6ns
4核的cpu支持8个线程,但是操作系统并没有限制只能启动8个线程,因为有个RR(时间片)调度,cpu运行的时间分成一个一个小段,没有进程被分配一个小段,也就是这个进程的分片,cpu去调度分片,在切换过程中,操作系统会保存数据,带入下个进程,这个过程称为上下文切换。因为切换会消耗资源,所以要控制线程数,就是要控制上下文切换的效率
什么是进程和线程
进程:资源分配的最小单位
线程: cpu调度的最小单位,共享进程中的资源,不能单独存在,必须依附于某一个进程,至少拥有一个进程。
澄清并行与并发
并行:高速路有8个出口,那么说这个高速路的并行数是8
并发:与时间有关,脱离时间就无意义啦,若在高速路上,8车道每秒能通过1台车,1分钟的并发量为60*8=480。
cpu核心数和线程数的关系
线程的安全,因为是共享资源的,所以可能造成数据的不安全
1、充分利用cpu的资源
2、加快用户响应的时间
3、模块化、异步化
2、认识Java里的线程
Java里的程序天生就是多线程的,name有多重新启动线程的方式呢?
1:继承Thread类
2:实现Runable接口
3:实现Callable接口
有开始就有结束,怎么样才能让Java里的线程安全停止工作呢?
stop() 强制地中断一个线程,可能造成数据的错乱,已废弃
suspend() 把当前的程序挂起,进入睡眠状态,不释放已经占有的资源,容易造成死锁,已废弃
interrupt()不会去中断一个线程,只是把中断标志位 置为true。若一个线程被标志为true,也不会被中断,也可以不理会这个请求,因为Java里的线程是协作式的,而不是抢占式的。
isInterrupted():检查一个线程是否要求被中断,然后再方法内interrupt()掉
static方法interrupted():判断线程是否处于中断状态
如果某一个方法会抛出InterruptedException,线程的终端标志位会被复位成false,不会被中断,如果要中断,必须在catch语句块中自行调用interrpt去中断
3、对Java里的线程在多一点点认识
线程常用方法和线程的状态
YieId 方法,是让当前线程让出cpu时间,操作系统依然可以选中当前线程。
Join方法, 让Join方法执行完成以后,才能让调用Join方法的进程继续执行下去。
notify方法,
notifyAll方法,
sleep方法,
wait方法,
线程的优先级:通过函数setPriority的方法是不可靠的
守护线程:是一种支持式线程,例如垃圾回收,如果主程序运行完,不管垃圾回收是否完成,主程序都会终止,如果让普通线程成为守护线程呢? 用函数setDaemon方法, 一定要在start方法之前设置才有效,
守护线程里面的 finally块不一定会执行
4、线程之间的共享
synchronized内置锁
1、用处
2、对象锁
3、类锁
volatile关键字,最轻量的同步机制
ThreadLocal的使用
5、线程间的协作
轮询:难以保证及时性,资源开销大,于是出现了等待和通知机制
等待和通知
wait:对象上的方法
notify和notifyAll :
等待方:
1、获取对象的锁
2、循环里判断条件是否满足,不满足调用wait方法
通知方:
1、获取对象的锁
2、改变条件
3、通知所有等待在对象的锁