java为什么引入进程和线程_为什么要引入线程?线程为什么能弥补进程的缺点...

首先我们需要明白,线程与进程一样,线程和进程会被os统一调度,所以所有的线程和进程都是一起并发运行的,如果线程不是并发的,是不可能实现程序的多线任务的。

有了线程以后,凡是程序涉及到多线任务时,都使用多线程来实现,使用多线程来实现时,线程间的切换和数据通信的开销非常低,正因为开销非常低,因此线程还有另一个名称,叫”轻量级的进程“。

总结的讲,说白了线程就是为了多线任务而生的,多线程的多线二字,不就是多线任务的多线二字吗。

疑问:使用线程来实现时,线程也需要切换和通信,这不跟进程一样吗?为什么线程就能降低切换和通信的开销呢?

为什么线程切换的开销很低

使用多进程来实现程序的多线任务,多线并发运行时,涉及到的是进程间的切换,我们前面就说过,进程间切换时开销非常大。

但是使用多线程来实现多线任务,由于线程本质上它只是程序(进程)的一个函数,只不过线程函数与普通函数的区别是,普通函数时单线的运行关系,而线程函数被注册为线程后,是多线并发运行,如图所示。

dfd817e84c6f5f288ee7e2e867ae1b76.png

对于普通函数来说,只有当相互调动时才会涉及函数间的切换,但是对于线程函数来说,只要运行的时间片到了就会切换,但是不管是那种函数间的切换,进程自己函数的切换只是进程内部的事情,不涉及进程间切换,函数切换当然也需要开销,但是这些开销相比进程间就省去了进程间切换的巨大开销。

当然如果是不同进程的线程之间需要切换的话,还是会涉及到进程间的切换的,但是不管怎么说,线程的出现,至少为程序内部多线任务之间的切换,省去了大笔的进程切换所导致“资源开销”。

为什么线程间数据通信的开销很低

线程的本质就是函数,请问大家函数之间如果想要数据共享(通信)的话,应该怎么办?

函数间通信有两种方式:

(1)具有相互调用关系函数来说

使用函数传参来通信。

(2)对于没有调用关系的函数来说

使用全局变量来通信。

A函数一一>全变变量一一>B函数

所以说全局变量的作用是什么?

就是用来实现无调用关系的函数间通信的。进程中所有的线程函数除了相互并发运行外,没有调用关系,所以线程函数间想要数据共享的话,就使用全局变量来通信。

从这里可以看出,进程内部的线程间进行数据共享非常容易,使用全局变量即可,根本不需要调用什么os提供的通信机制,所以线程间通信的开销自然就非常的低。

进程间的通信需要调用操作系统提供的相关函数,这些函数运行需要开销。

那么疑问来了,线程切换就不需要开销吗?

刚说过,线程的切换其实就是函数间的切换(保存函数状态在栈中),切换的开销来说,已经非常小了。

是不是有了线程后,进程是不是就不需要了

线程是不可能完全替代掉进程的,只有在多线任务时会替代进程,但是运行新程序时,还是必须通过创建子进程来实现。

通过前面的讲解,我们知道线程的本质是函数,函数运行需要内存空间,这个内存空间怎么来,事实上线程所需内存空间就是进程的内存空间,因此线程的运行时依赖于进程,如果没有进程所提供的内存空间这个资源,线程根本无法运行。

换句话说,线程作为函数,只是进程的一个部分而己,线程是不可能脱离进程而独立存在。

所以同一个进程中的所有线程,都是运行在进程空间中的,换句话说同一个进程中所有线程共享相同的进程空间。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值