【java 多线程】Java多线程技术学习笔记(一)

最近自己在研究学习java的基础,只有基础打牢了,万丈高楼才会平地起!所以想到整理下java的多线程技术吧!可能有错误的地方,希望大牛作指导!

概述

首先得了解进程,打开我们电脑的windows资源管理器,可以直观看到进程的样子:

进程直观上理解就是正在进行的程序。而每个进程包含一个或者多个线程。也就是说一个进程是由若干线程组成的,在程序执行期间,真正执行的是线程,而进程只是负责给该进程中的线程分配执行路径,

所以,线程就是进程中负责程序执行的控制单元(执行路径),一个进程可以有多个执行路径,称为多线程。就像我们再使用QQ给多个好友聊天一样,每一个聊天过程都是一个线程,这些线程都属于QQ这个进程。

而开启多线程就是为了同时运行多部分代码。每一线程都有自己运行的内容,这个内容可以称为线程要执行的任务

聊到这儿,那我们就得了解线程是什么?进程是什么?二者有什么区别和联系?

(1)线程是CPU独立运行和独立调度的基本单位;
(2)进程是资源分配的基本单位;
两者的联系:进程和线程都是操作系统所运行的程序运行的基本单元。
区别:
(1)进程具有独立的空间地址,一个进程崩溃后,在保护模式下不会对其它进程产生影响。
(2)线程只是一个进程的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。

说到这,有得了解什么是堆栈?有什么区别?
堆栈都是一种数据项按序排列的数据结构,只能在一端对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。要点:堆,队列优先,先进先出(FIFO—first in first out)[1]  。栈,先进后出(FILO—First-In/Last-Out)。

内存的分区:常量区,静态区(全局区),堆,栈,代码区
     1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存泄露。
     2.申请大小:如果栈申请的空间超过栈的剩余空间时,将提示内存溢出(8M)。因 此,能从栈获得的空间较小。堆是由于系统是用链表来存储的空闲内存地址的,不是连续的堆获的空间比较灵活,也比较大。
     3.碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎 片,使程序效率降低对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
     4.分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
     5.分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的

多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差写,对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

紧接着,就聊到了什么是多线程?
多线程:是指从软件或者硬件上实现多个线程的并发技术。
多线程的好处:
(1)使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片、视屏的下载
(2)发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
多线程的缺点:
(1)大量的线程降低代码的可读性;
(2)更多的线程需要更多的内存空间
(3)当多个线程对同一个资源出现争夺时候要注意线程安全的问题。
IOS中实现多线程的方法
常用的:NSThread NSOperationQueue GCD

煮个栗子来了解啥是多线程:

  每一个程序可以包含至少一个线程,而多个线程之间可以“并发”执行。

       在介绍线程前先来用生活中最常见的一个小例子来理解什么是线程:

       假如你去一家餐馆吃饭,那家餐馆只有一个服务员,所以这个唯一的服务员给你点菜的时候,别的去餐馆吃饭的人就得等着。但是如果这个餐馆有多个服务员的话,那么在同一时刻就可以给多个去餐馆吃饭的人点菜,这里举A、B两个服务员,分别接待甲、乙两个顾客,而每个顾客点了不同的三道菜。

       上面例子中的餐馆可以理解成一个程序,而A、B两个服务员可以理解成两个线程,后厨做菜的厨师可以看做是CPU(假设只有一个CPU)。

        从A、B两个服务员同时接待甲、乙两个顾客这个表象来看线程是“同步”、“并发”执行的,但是在厨师做菜的过程中还是有先后之分的,只是厨师会把甲乙两个顾客点的菜分开来做,做完甲的一道菜后立刻开始做乙的一道菜,这样不停地切换着做甲乙两个顾客点的菜。而在甲乙顾客看来他们桌上都有着菜吃,误以为他们的菜是同时做出来的。

        而计算机里的多线程也是如此,cpu会分配给每一个线程只有极少的运行时间,时间一到就交出运行权,所有线程被快速的切换执行,因为cpu的执行速度非常的快,所以在执行的过程中我们可以简单的认为这些线程是“并发”执行的。

        上面厨师做菜的原则是:不同的切换顾客们点的菜。假设厨师做菜的原则变了,是单顾客原则:给一位顾客做完所有的菜后再给别的顾客做菜,就是说先一下子把甲点的三道菜全做出来后再去做乙点的那三道菜,这样的话如果厨师在做甲的某一道菜时发现甲点的那道菜的原料没有了,那么乙的菜就得一直等着。

         如果是在计算机中,单顾客原则执行线程的话,当一个恶性的线程运行不下去时,计算机就会出现死机的现象,这时候只能重启。

         上面介绍的厨师做菜的两种原则分别代表着计算机中线程的两种调度形式:抢占式调度和非抢占式调度。应用中我们一般用抢占式调度(即厨师的第一种做菜原则)。

       上面就是我对多线程在实际生活中的理解,希望能给刚刚接触多线程的朋友一些帮助,这个比喻如果有不妥或者不到位之处还请留言指出。

后续会对多线程技术做研究更新!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值