/*

不是技术性的文章,只是记录自己每天学习的方式

----------------------------程序猿的征途是星辰的大海

*/


[1] 何为多线程?

在多线程学习之前,很多人将进程,线程,异步,同步,串行,并发混为一谈,概念混淆很严重,甚至在使用一些第三方类库的时候,不知道它进行数据请求使用的是何种方式,是异步还是同步,多线程还是单线程。这里我总结了几天来接触的多线程方面的知识,把概念性的内容理清。

进程:在IOS系统中,经常将一个应用等任务作为一个进程。

1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)

线程:进程的组成单位,是进程中一些多次重复使用的代码块

线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行

比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行

特点:一个线程同一时刻只能执行同一任务,如果多个任务交给同一任务来完成,

那么该线程就会执行完一个任务后再去执行下个任务,直到任务全部被完成。

【多线程解释】:

基于进程与线程的特性,我们在一个进程中可以开辟多条线程,他们可以并行(也就是时间上同步)的执行不同的任务,好比进程为项目组,线程为项目组成员。多个线程可以同时执行不同的任务,就好比项目组成员可以同时有不同的分工,如美工和程序猿有不同的项目任务。

我们需要注意的是:在单核的时代:CPU并不能同时执行多个线程!WTF!

虽然听起来不能接受,但确实是这样的,CPU在同一时间只能执行一个线程,之所以看起来多个线程能同时进行工作,这是因为CPU在多个线程之间来回切换的原因,如果cpu来回切换的速度够快,就造成了多线程并发执行的假象。

多核心的时代里, 内核级结构使用抢占式的方式,将下一个线程安排在空闲的内核上,这里就不过多赘述,不论是单核还是多核心的方式,多线程都会提高对CPU工作的要求。

也因为这样的原因,线程过多的情况下,CPU资源就会被过多的占用,处理数据和资源的速度也会下降,所以要尽量控制一个进程中多线程的个数。(默认占用内存情况为主线程占用1M,子线程占用512KB)

多线程的优点:能适当提高程序的执行效率,能适当提高资源的利用率

多线程的缺点:线程的开始和退出都是需要内存空间来支持的,程序的复杂度也被增加,

不利于阅读理解,线程越多的时候,整个进程对CPU的开销越大。

使用多线程需要多关注这方面的内容,不能过于随意的开启新线程。


[2]主线程 和次线程 (工作线程)

主线程:在每个进程中都存在一个主线程,所有的UI控件搭建和手势拖拽以及视图滚动等都是在主线程中实现的。

我们常常需要进行一些耗时较长的工作,如数据请求,循环获取数据或者处理内容,这些时候,主线程会被捆绑导致整个视图屏幕无法被点击,出现假死的情况,这对用户体验是致命的,我们为了避免出现这类的情况,往往采取开辟次线程的方法

次线程:又称为工作线程,主要作用就在于分担主线程的任务,并可以防止屏幕假死事故。


[3]串行和并行:

串行:使用 一个线程处理多个任务时,必须按照顺序一个个执行。

并发:多个线程同步执行不同的任务。


[4]NSThread 简单的开启多线程

对于NSThread来说,它是一种简单的开启多线程模式的方法。通过在主线程实例化它的对象,执行start方法(类方法初始化的NSThread对象自动执行),就可以简单的实现一个次线程。

<1>简单实现多线程的例子

//在视图中创建两个按钮
-(void)creatUIButton{NSArray * arr=@[@"线程1",@"线程2"];for(int i=0;i<2;i++){UIButton * btn=[UIButton buttonWithType:UIButtonTypeCustom];btn.frame=CGRectMake(110, 100+100*i, 100, 30);btn.tag=i+1;btn.backgroundColor=[UIColor grayColor];[btn setTitle:arr[i] forState:UIControlStateNormal];[btn setTitleColor:[UIColor cyanColor ] forState:UIControlStateNormal];[btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];}
}
//执行按钮的点击事件
-(void)pressBtn:(id)sender{//搭建子线程UIButton * btn = (UIButton *)sender;//多个线程并发工作 互不影响if(btn.tag==1){//1⃣️类方法创建线程对象/* 参数解释:第一个参数为选择器方法 第二个参数为方法响应者  第三个对象为传递的参数,为OC对象 */NSNumber * num=@10;[NSThread detachNewThreadSelector:@selector(threadMain1:) toTarget:self withObject:num];//使用类方法创建线程对象,不需要手动开启线程,只要线程被创建,就会自动调用线程方法。}else{NSNumber * num=@10;//2⃣️使用实例方法,创建线程对象,但必须手动开启线程NSThread * thread= [[NSThread alloc]initWithTarget:self selector:@selector(threadMain2:) object:num];//手动开启线程
        [thread  start];}
}
//线程1执行代码
-(void)threadMain1:(NSNumber *)num{NSLog(@"线程1 开始>>>>>>>>");for (int i=0; i<[num intValue]; i++) {NSLog(@"线程1  >>>>  i = %d",i);[NSThread sleepForTimeInterval:0.1 ];//线程沉睡0.5秒
    }NSLog(@"线程1 结束");
//线程结束 就会立即退出  (消失)
}
//线程2执行代码
-(void)threadMain2:(NSNumber *)num{NSLog(@"线程2 开始!-------------!");for (int i=0; i<[num intValue]; i++) {NSLog(@"线程2  i = %d",i*1000);[NSThread sleepForTimeInterval:0.3];//线程沉睡0.5秒
    }NSLog(@"线程2 结束");}

-------在该实例中我们先点击线程一按钮,随后立即点击线程2按钮

如果是在主线程中执行的两个点击事件,它们会怎么执行了?

这个想必很多人都清楚,在点击第一个按钮之后,随后点击第二个按钮,他们的点击事件是依次进行的。

在按钮1的点击事件还没有结束的时候,按钮2的点击事件不会响应。

那么如果是在次线程中执行的两个点击事件,它们会怎么执行了?


我们来看该实例的执行结果

可以看出在线程一的点击事件还没有结束的时候,点击线程2按钮,程序立刻开启了线程2方法。因此,我们可以知道:

多线程不会受彼此干扰,只要从主线程开辟一个次线程,它就能独立的完成你安排的任务。我们也可以在主线程中打印一些标志性的内容,可以看出,主线程的任务不会因为次线程在进行而终止,它会继续执行自己的代码而不是等待次线程结束。

转载于:https://www.cnblogs.com/Sweet-Magic/p/4764352.html

IOS多线程管理1关于多线程你必须知道的二三事相关推荐

  1. java多线程信息共享 多线程管理

    java多线程信息共享 & 多线程管理 信息共享 多线程管理 信息共享 继承Thread的类通过static共享变量: 实现Runnable接口的类私有变量即可. 对于信息共享数据不一致的问题 ...

  2. ios查看线程数量_iOS多线程进阶

    .一.进程 进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开迅雷.Xcode,系统就会分别启动2个进程 二.线程 1.什么是线程 ...

  3. ios 内存管理的理解(一) 简述

    1. 内存管理的范围 所有的OC对象(继承自NSObject类) 本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中. 当代码块结束时,这个代码块 ...

  4. iOS内存管理机制解析

    软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效.快速的分配内存,并且在适当的时候释放和回收内存资源. 一.Objective-C内存管理的对象 IOS开发 ...

  5. iOS内存管理——alloc/release/dealloc方法的GNUstep实现与Apple的实现

    关于阅读<Object-C高级编程-iOS与OS X多线程和内存管理>一书后的iOS内存管理系列思考 <关于iOS内存管理的规则思考> <iOS内存管理--alloc/r ...

  6. 终于明白那些年知其然而不知其所以然的iOS内存管理方式

    终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...

  7. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...

  8. python多线程爬虫实例-Python多线程在爬虫中的应用

    题记:作为测试工程师经常需要解决测试数据来源的问题,解决思路无非是三种:(1)直接从生产环境拷贝真实数据 (2)从互联网上爬取数据 (3)自己用脚本或者工具造数据.前段时间,为了获取更多的测试数据,笔 ...

  9. python多线程的作用_Python多线程中三个函数的强大功能简介

    在Python多线程中有三个比较简单的函数,在实际的相关操作中你对这一实际操作是否了解?是否对其感兴趣?如果你想对Python多线程的开发与多线程程序及相关实际操作方案有所了解的话,你就可以点击以下的 ...

最新文章

  1. 超级全面的 SpringBoot 注解介绍,每一个用途都应该清晰
  2. 利用找因子来找方程解的个数
  3. From Apprentice To Artisan 翻译 19
  4. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis
  5. 启动修复可以尝试将您的计算机还原到,如何修复Windows Bootloader问题(如果您的计算机不启动) | MOS86...
  6. c语言从excal读取字符串,C语言操作EXCEL文件(读写)
  7. Python第3次作业
  8. 报名 | 上道沙龙:科技如何赋能传统金融?
  9. Matlab实现图像识别(四)
  10. 类的继承------C++
  11. HDU6184 Counting Stars
  12. Typora桌面快捷方式创建
  13. 彼得·林奇的成功投资
  14. Stadia云游戏平台
  15. 网络寻宝图 v1.0 官方
  16. 牛顿下山法(Matlab实现)
  17. 程序猿生存指南-60 一晌贪欢
  18. fsl左右海马体分割+freesurfer合并
  19. RocketMQ 分布式事务消息过程分析
  20. Matlab 图像傅里叶变换

热门文章

  1. vue cli3--创建通用模版
  2. Sql: 去除字符串中的相同的字符串函數
  3. Manage,管道的简单应用,进程池,队列的简单应用
  4. 2017北京国庆刷题Day2 afternoon
  5. 第14讲 转换与比较指令
  6. Angular移动工具集要让Web应用有原生的感觉
  7. C# 版本设计模式(Design Pattern)(转)
  8. C#获取IP和整数IP方法
  9. LeetCode题解:Add Two Numbers
  10. SharePoint2013的头像显示和读取