IOS多线程管理<1>关于多线程你必须知道的二三事

/*

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

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

*/



[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 * [email protected][@"线程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 * [email protected]10;
        [NSThread detachNewThreadSelector:@selector(threadMain1:) toTarget:self withObject:num];
        //使用类方法创建线程对象,不需要手动开启线程,只要线程被创建,就会自动调用线程方法。
    }else{
        NSNumber * [email protected]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方法。因此,我们可以知道:

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

时间: 2024-10-31 18:27:22

IOS多线程管理<1>关于多线程你必须知道的二三事的相关文章

IOS 多线程管理机制

一.多线程管理机制 二.NSThread 三.NSOperation 四.GCD : 全称 Grand Central Dispatch ,一套底层 API,提供并发程序编写. 基本概念就是 Dispatch queue (调度队列),并且提供了三种队列: The main queue : 与mian线程功能一样,main queue 队列的任务在主线程中执行,main queue 通过 dispatch_get_main_queue 获取,由于与主线相关,所以是串行队列. 全局队列 globa

ios中的几种多线程实现

iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa operations;3, Grand Central Dispatch (GCD) (iOS4 才开始支持)下面简要说明这三种不同范式:Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间,它

ios学习记录 day41 UI17 多线程

CPU(工厂) 进程(车间) 线程(工人) 一个进程代表一个应用程序 CPU总是运行一个进程,其它进程处于非运行状态.一个进程可以包含多个线程.线程与线程之间可以共享进程的内存区域. 打开一个应用程序,系统会给我们创建一个线程,称为主线程 管理主界面的UI与内部循环机制(与界面相关的东西必须放在主线程中!!!) 压力比较大且会造成线程阻塞(界面卡),因此我们通过创建子线程来对主线程进行分压. 什么时候用多线程 1.网络请求(同步的) 2.文件读写(少) 3.大数据计算(冒泡) 4.数据库sele

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题. GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识. 在开始之前,需要理解是要提供给GCD队列的是代

iOS 面试常问之多线程

本片围绕多线程全面展开叙述. 1.为什么要有多线程/多线程是用来干什么的? 2.多线程是什么? 3.如何创建多线程? 4.多线程在哪些情况下会使用/多线程使用场景? 5.三种多线程的优缺点? 1.为什么要有多线程/多线程是用来干什么的? 每个iOS应用程序都有个专门用来更新显示UI界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程

iOS开发中的gcd多线程tips

iOS开发中的gcd多线程tips 我们经常用到的: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块 //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新 }); }); 其中main_queue是系统默认的串行队列,global_queue是系统默认的并行队列. 什么是串行队列(Serial)? 创建任意个数的串行队列,每个队

OC多线程管理

在OC中多线程管理包含GCD.NSThread.NSOperationQueue. 下面简单介绍. 进程和线程 进程:正在进行中的程序叫做进程,负责程序运行的内存分配. 每一个进程都有自己独立的虚拟内存空间. 线程:线程是进程中一个特立的执行路径(控制单元) 一个进程至少包含一条线程,即主线程,开发中通常把比较耗时的线程(如:网络请求)放在子线程中执行. 创建线程的目的:开启一条新的执行路径,运行指定的代码,与主线程的代码能够实现同时执行. 一.GCD GCD:Grand Central Dis

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

IOS 内存管理

一.前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦. OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存.这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小. 二.基本原理 对象的创建: OC在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针,因此出来基本类型以外,我们在OC中基本上都在使用指针. ClassA  *