什么是线程
一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成
- 并行:多个cpu实例同时分别执行多段处理逻辑,一个cpu对应一个
- 并发:利用cpu调度算法,单个cup执行多段处理逻辑
特点
- 一个进程中至少有一个线程
- 多线程是为了提高资源使用效率
多线程与多核
- 多核(心)处理器是指在一个处理器上集成多个运算核心,每一个处理核心对应一个内核线程
- 内核线程就是直接由操作系统内核支持的线程
- 一般一个处理核心对应一个内核线程,但也可以有多个,比如常听到的“四核八线程”
- 轻量级进程:程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口
- 轻量级进程就是我们通常意义上所讲的线程(我们在这称它为用户线程)
- 每个轻量级进程都由一个内核线程支持
- 多线程下传统的操作系统(windows、linux)采用“时间片轮训”的方式进行用户线程调度。(执行一段等待一定时间再执行)
生命周期
- 创建
- 就绪:时间片已用完,此线程被强制暂停,等待下一个属于他的时间片到来;
- 运行:此线程正在执行,正在占用时间片;
- 阻塞:也叫等待状态,等待某一事件(如IO或另一个线程)执行完;
- 退出:一个线程完成任务或者其他终止条件发生,该线程终止进入退出状态,退出状态释放该线程所分配的资源。
java中的线程状态切换
新建(New) :使用new Thread() 创建
运行(Runnable) :使用Thread.start()
无限等待(waiting) :需要等待其他线程显式地唤醒才能运行
- 调用Thread.join() 方法。将会一直等待上一个线程的执行结束,然后被上一个线程唤醒。
- 调用Object.wait() 方法。将会一直等待,直到其他线程中使用了notify()、notifyAll()进行唤醒。
有限等待(timed waiting) :可以被其他线程显式地唤醒,也可以在一定时间后由系统自动唤醒
- 调用Thread.sleep(timeout) 方法。该方法不会释放持有的对象锁。
- 调用Object.wait(timeout) 方法。该方法会释放持有的锁。
- 调用Thread.join(timeout) 方法。
阻塞(blocked) :阻塞是在等待获取一个排它锁
- 由synchronized 修饰的代码块、方法。使得线程之间有并行变成串行执行以保证同步效果,如火车订票。
- IO操作,也是串行执行。
结束(terminated) :当线程的run() 方法执行结束后
线程与锁
- 二元信号量:一种最简单的锁,它有两种状态:占用和非占用
- 信号量:多元信号量允许多个线程访问同一个资源,简称信号量,对于允许多个线程并发访问的资源
- 互斥量:类似二元信号量资源仅允许一个线程访问,不同的是互斥量要求哪个线程获取了该互斥量锁就由哪个线程释放
- 临界区:临界区的作用范围仅限于本进程,其它的进程无法获取该锁。除此之处,临界区与互斥量的性质相同
- 读写锁:允许多个线程同时对同一个数据进行读操作,而只允许一个线程进行写操作
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!
本文出自:monkeyGeek
座右铭:生于忧患,死于安乐
欢迎志同道合的朋友一起交流、探讨!
