基础概念
-
cpu核心数和线程数的关系: 核心数:线程数=1:1,使用了超线程技术后为1:2
-
cpu时间片轮转机制: 又称为RR调度,会导致上下文切换
-
进程和线程:
进程:程序运行资源分配的最小单位,进程内部有多个线程,会共享这个进程的资源
线程:CPU调度的最小单位,必须依赖进程而存在
-
并行和并发
并行:同一时刻,可以同时处理事情的能力
并发:与单位时间相关,在单位时间内可以处理事情的能力
高并发编程的优点和注意事项
-
优点:充分利用CPU的资源、加快用户响应的时间,程序模块化、异步化
-
注意事项:线程共享资源,存在冲突;容易导致死锁;启用太多的线程,容易拖垮机器
Java中的线程
大家肯定都听说过这句话:“Java天生就支持多线程”!!!下面我们就介绍下Java中的线程
扫描二维码关注公众号,回复:
10416167 查看本文章
- Java中创建线程的三种方式,这里就不一 一介绍了
- 怎样才能让Java中的线程安全停止工作? 线程自然终止:自然执行完或抛出未处理异常stop(),resume(),suspend()(suspend方法已不建议使用)stop()会导致线程不会正确释放资源,suspend()容易导致死锁。
- Java线程是协作式,而非抢占式:调用一个线程的interupted()方法中断一个 线程,并不是强行关闭这个线程,知识跟这个线程打个招呼,将线程的中断标志位置置为true,线程是否中断,有线程本身决定。
- isInterrupted()方法作用:判定当前线程是否处于中断状态。
- static方法interrupted()判定当线程是否处于中断状态,同时中断标志位改为false。
- 方法中如果抛出InterruptedException,线程的中断标志位会被复位为false,如果确实是需要中断线程,要求我们自己在catch语句块中再次调用interrupt()。
线程常用方法和线程的状态
-
线程只有5中状态,整个生命周期就是这几种状态的切换。
-
run()和start():run方法就是普通对象的普通方法,只有条用了start()之后,Java才会将线程对象和操作系统中实际的线程进行映射,再来执行run()方法。
-
yield()方法:让出CPU的执行权,将线程从运行转到可运行状态,但是下个时间片,该线程依然有可能被再次选中运行。
-
线程的优先级:取值为1~10,缺省值为5,单线程的优先级不可靠,不建议作为线程开发时候的手段。
-
守护线程:和主线程共生死,finally不能保证一定执行。
线程间的共享
- synchronized内置锁:对象锁,锁的是累的对象实例;类锁,锁的是每个累的的Class对象,每个类的Class对象在一个虚拟机中只有一个,所以类锁也只有一个。
- volatile关键字:适合于只有一个线程写,多个线程读的场景,因为它只能确保可见性。
- ThreadLoacl:线程变量,可以理解是个map,类型Map<Thread,Integer>
- 线程间协作:轮询,难以保证及时性,资源开销很大。
- 等待和通知:wait(),对象上的方法
- notify、notifyAll 对象上的方法
- 等待和通知的标准范式:
- 等待方: a.获取对象的锁; b.循环里判断条件是否满足,不满足调用wait()方法; c.调用满足执行业务逻辑。
- 通知方: a.获取对象的锁; b.改变条件; c.通知所有等待在对象的线程。