本篇文章收录于多线程,也欢迎翻阅博主的其他文章,可能也会让你有不一样的收获
多线程 数据结构 JavaSE
首先,“并发编程”成为不可缺少的一部分
随着计算机的进步,单核CPU已经不能解决大部分的技术场景,所以并发编程可以充分的利用多核CPU的资源
比如,有些任务场景需要等待IO,而在等待IO的时间中,也可以去做其他的任务,也需要用到并发编程,比如:我们在登录微信要输入密码时,在这个时间,我们也可以去打开网页、登录qq等等;
但是进程也可以进行并发编程,为什么还要有进程呢?
因为以下几点:
1.创建一个进程消耗的时间比较多
2.销毁一个进程消耗的时间比较多
3.调度一个进程消耗的时间比较多
虽然进程也可以进行并发编程,但是太重量了,效率比较低,因为进程是资源分配的基本单位(这一点在进程的文章中介绍过), 而分配资源这就是一个大工程,所以就会导致效率较低;虽然在平时,创建一个进程看起来挺快的,但是,站在计算机的角度,与线程相比,效率就会相形见绌了;因此,就引入了 “线程”(Thread)
线程也称为“轻量级进程”;
创建一个线程比创建一个进程快
销毁一个线程比销毁一个进程快
调度一个线程比调度一个进程快
线程不能独立存在,是要依附于进程,换句话来讲,进程里面包含了线程,一个进程里可以包含一个线程,也可以包含多个线程;一个进程里面至少是有一个线程(主线程),也可以根据需要创建出更多的线程,每个线程都可以独立的执行一些工作,所以没有个线程都是一个单独的“执行流”,每个线程之间都可以独立的进行调度,多个线程之间就可以进行”同时“调度,而这个”同时“到底是并发还是并行,就要看操作系统如何实现了,所以线程就可以实现“并发编程”;
举个例子:
比如有一家公司,现在要到银行去进行 财务转账、贷款、办理社保等等业务,公司就派了张三去完成,但是呢,由于业务比较多,张三一个人完成起来就非常的费时间,所以就喊来了李四和王五帮忙,这样效率就会高很多,所以公司就好比是一个进程,张三、李四、王五就好比是三个执行流(线程),虽然它们各自都在完成不同的任务,分配一个业务员也可以同时为他们服务,因为归根结底它们都是在为同一家公司工作;与上篇文章中的进程大大不相同,上一个文章中举了取钱的例子,读者可以去看一下就会茅塞顿开了;
前面文章说过过,一个进程由一个PCB或着多个PCB表示,现在又讲了一个进程里有一个线程或多个线程,所以每个PCB都对应到一个线程上,所以每个线程都有自己的“状态、记账信息、优先级、上下文”这些信息进行辅助调度,而前面的文章中,谈到的 pid、内存指针、文件描述符表 这些的内存资源对于多个线程来说都是共享的;
所以上述结构就构成了线程的特点:
1.同一个进程中多个线程之间,共用同一份内存资源和文件资源(硬盘资源)
2.每个线程都可以独立的去CPU上调度执行;
所以,每次创建线程时,就不用再为线程分配内存资源了,直接使用了之前已经分配给进程的资源,所以相对于进程就大大提高了效率;
总结以上知识点:
进程包含了线程 => 一个进程由一个或多个PCB表示 => 一个PCB就是一个线程 => 每个线程都有自己的”状态、优先级、上下文、记账信息“ => 同一个进程中的所有线程共用了同一份内存资源(内存指针、文件描述符表等) => 每一个线程都可以独立的进行调度;
以上重点得出两句话:
进程是资源分配的基本单位
线程是调度执行的基本单位
不知道读者有没有这样的问题:就是因为一个进程里面包含了多个线程,而在线程调度执行时,是将一个进程里面的所有线程调度执行完之后,再去调度另一个进程里面的所有线程?这之间有没有这要那个的顺序;
答案是:没有,每个线程都是独立调度执行的,而在线程调度执行时,操作系统就不会在关心进程这个概念了;就没有顺序关系;
根据进程和线程的讲解,就会引发出一个经典的面试题:进程和线程的区别?
1.进程包含了线程,一个进程里面可以有一个或者多个线程;
2.进程和线程都是用来实现并发编程的,但是线程比进程更“轻量“
3.创建进程时,操作系统会为每一个进程分配单独的资源,同一个进程中的多个线程是共享同一份内存资源的,省去了分配资源的开销
4.因为进程具有单独的内存资源,所以进程和进程之间是具有独立性的,一个进程挂了,不会影响其他的进程,但是在同一个进程中,线程之间由于线程安全或线程异常问题互相可能会产生影响;
5.进程是资源分配的基本单位,线程是调度执行的基本单位