线程

什么是线程

线程是程序执行流的最小单元,是处理器调度和分派的基本单位。

一个标准的线程由线程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

座右铭:生于忧患,死于安乐

欢迎志同道合的朋友一起交流、探讨!

monkeyGeek

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×