线程基础
Posted ymd12103410
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程基础相关的知识,希望对你有一定的参考价值。
cpu:承担所有计算的任务
操作系统:是计算机的管理者,它负责任务调度,资源分配和管理,统领整个计算机硬件
应用程序:是某种功能的程序,程序运行于操作系统上
进程由: 程序, 数据集合 和 进程控制块 三部分组成
程序:用于描述进程要完成的功能,是控制进程执行的指令集。
数据集合:是程序在执行时所需要的数据和工作区
程序控制块:包含进程的描述信息和控制信息,是进程存在的唯一标识
每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离。
进程是操作系统分配资源的最小单位,线程是程序执行的最小单位(线程出现的一个原因是进程间切换开销较大)
各个线程之间共享程序的内存地址(也就是进程所在的内存空间)
一个标准线程:线程ID,当前指令指针(PC),寄存器和堆栈组成
进程:内存空间(代码数据,进程空间,打开的文件)和一个或多个线程组成
进程与线程的资源共享关系
当线程的数量小于处理器的数量时,线程的并发是真正的并发,不同的线程运行在不同的处理器上,当线程的数量大于处理器的数量时,线程的并发会受到一些阻碍,此时不是真正的并发,因为此时至少有一个处理器会运行多个线程
频繁等待的线程:称为IO密集型线程
频繁进行大量计算以至于每次都把所有时间片全部耗尽,很少等待的线程:称为 CPU密集型线程
在优先级调度环境下,线程优先级的改变有三种方式
1.用户指定优先级
2.根据进入等待状态的频发程度提升或降低优先级(由操作系统完成)
3.长时间得不到执行而提升等级
要将多个线程对同一数据的访问同步,确保线程安全。
同步:即指一个线程访问数据时,其他线程不得对同一数据进行访问,即同一时刻只能有一个线程访问该数据
每一个线程在访问数据或资源之前,首先试图获取对该数据的锁,并在访问结束之后释放对该数据的锁,在锁被占用时试图获取锁,线程会进入等待状态,直到锁被释放数据再次变为可用。
二元信号量:有占用与非占用两种状态,适合只能被唯一一个线程独占访问的资源
当二元信号量锁被置为占用状态,之后其他试图获取该二元信号量的线程会进入等待状态,直到该锁被释放
多元信号量(简称信号量):允许多个线程访问资源,一个初始化值为N的信号量允许N个线程并发访问,线程访问资源时,首先获取信号量锁,进行如下操作:
1.将信号量值减一
2.如果信号量值小于0,则进入等待状态,否则继续执行
访问资源结束后,线程释放信号量锁,进行如下操作:
1.将信号量的值加1
2.如果信号量的值大于1,去唤醒一个等待中的线程
信号量在整个系统中可以被任意线程获取和释放,也就是说,同一个信号量,可以由一个线程获取,而由另一个线程释放,而互斥量则要求哪个线程获取了该互斥量锁就由哪个线程释放
临界区:是一种比互斥量更加严格的手段,互斥量和信号量在系统的任何进程都是可见的,也就是说一个进程创建了互斥量和信号量,另一个进程试图获取该锁是合法的,而临界区的作用范围仅限于本进程,其他进程无法获取该锁。
读写锁:允许多个线程同时对同一个数据进行读操作,而只允许一个线程进行写操作
有两种获取方式:共享的和独占的(Exclusive)
锁处于共享,其他线程以共享方式获取该锁仍能成功,此时该锁分配给了多个线程
处于独占状态的锁阻止任何线程获取该锁,不论它们以何种形式
读写锁的状态 以共享方式获取 以独占方式获取
自由 成功 成功
共享 成功 等待
独占 等待 等待
引自:https://blog.csdn.net/luoweifu/article/details/46701167
以上是关于线程基础的主要内容,如果未能解决你的问题,请参考以下文章
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段