苹果的Cocoa框架支持的多线程机制有三中NSThread、GCD、NSOperation。

NSThread:是官方推荐的也是最主要的线程创建方式,可是须要开发这自己去管理线程的生命周期比如线程同步和内存共享等问题。

NSOperation:假设想要多个线程并行那么就须要把线程增加队列中。NSOperationQueue提供了队列的管理方法,我们能够用addOperation把线程对象以数组的形式一次性增加到队列中,而且能够设置队列的并行数量。线程运行是有序的

GCD:Grand Central DisPatch(中央调度)是Apple多核编程的解决方法。IOS4.0后引入。通过blocks实现多线程机制。

************************************************************************************************************

GCD  VS  NSOperation:

GCD是一种用轻量级的代码来实现的工作单元。故意于把代码合并运行。不须要手动管理,统一有系统负责调度。可是比較难实现线程之间的依赖关系。没法按序列运行。

NSOperation:比起GCD来说会添加代码量,可是能够加入线程之间的依赖关系。故意于序列化运行线程。

而且NSOperation兼容KVO。

能够设置键值监听。

线程之间同步方法:

@synchronized、NSLock、递归锁NSRecursiveLock、条件锁NSConditionLock、分布锁NSDistributedLock

》》GCD下实现多线程同步相互排斥:

GCD下的dispatch_queue队列都是FIFO(先入先出)队列。会依照队列提交树勋运行。

同步dispatch_sync、异步dispatch_async.

》》GCD下的线程分组:

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行运行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行运行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
});

》》GCD下的信号量:

信号量用来实现多个线程之间获取同一个资源的个数。当资源个数>0的时候运行操作,小于等于0的时候堵塞。

// 信号量初始化为1
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //1.先去网上下载图片
dispatch_async(queue, ^{ // wait操作-1
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
// 開始下载
// signal操作+1
dispatch_semaphore_signal(semaphore);
}); // 2.等下载好了再在刷新主线程
dispatch_async(dispatch_get_main_queue(), ^{ // wait操作-1
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
//显示图片
// signal操作+1
dispatch_semaphore_signal(semaphore);
});

》》GCD能够使处于后台执行的时间长达10分钟之久:当按home后。

IOS_多线程的更多相关文章

  1. IOS_多线程_ASI_AFN_UIWebView

    H:/0730/00_多线程4票种_ViewController.h // // ViewController.h // 卖票 // // Created by apple on 13-7-29. / ...

  2. iOS_多线程(二)

    上篇中我们分享了NSThread.NSOperation&NSOperationQueue如何实现多线程,今天我们来看下第三种实现多线程的方式:GCD(Grand Central Dispat ...

  3. iOS_多线程(一)

    在学习多线程之前首先搞清楚以下几个问题. 并发:在同一时刻,只有一条指令被执行,多条指令进行快速切换执行. 并行:在同一时刻,多个处理器可以处理多条指令 1.什么是进程?      一个运行的程序就是 ...

  4. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  5. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  6. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  7. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  8. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  9. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

随机推荐

  1. Android内存机制分析2——分析APP内存使用情况

    上面一篇文章说了Android应用运行在dalvik里面分配的堆和栈内存区别,以及程序中什么代码会在哪里运行.今天主要是讲解一下Android里面如何分析我们程序内存使用情况.以便后续可以分析我们程序 ...

  2. 如何让docker以daemon方式运行/bin/bash

    本文转自:https://segmentfault.com/q/1010000000424935 问题: 我想在docker run的时候,用-d参数运行/bin/bash,然后让这个bash一直跑着 ...

  3. 解决nginx reload失败

    1. 失败提示信息 nginx: [error] open() : No such file or directory) 2. 解决方法 /usr/local/nginx/sbin/nginx -c ...

  4. PowerDesigner导入java类生成类图

    1;打开PowerDesigner 2;file—>Reverse Engineer—>Object Language... 3;弹出一个对话框,在General模块下Model Name ...

  5. <跟股市谚语学炒股> 读书笔记

    书在这里 一般情况下,当成交清单上显示的买盘金额大.笔数少,卖盘金额小.笔数多时,系主力在建仓.散户在卖出:相反,若买盘金额小.笔数多,卖盘金额大.笔数少时,系主力在出货.散户在买入 一般来说,当大盘 ...

  6. DataTable 行删除

    今天在阅读一个项目中的代码时,发现删除DataTable的数据时用的dataTable.Clear(); 由于以前自己习惯都是用dataTable.Rows.Clear();因此突然感觉到很茫然,难道 ...

  7. SpringBoot 无法显示html文件 找不到html文件 如果显示html文件

    两种情况: 1.如果使用了 thymeleaf 模板引擎,html文件可以放在 template文件夹中,如果不是一定不要放进去,否则找不到,因为html是静态页面,所以放在把此类文件放在了stati ...

  8. PCL中可用的PointT类型

    PCL中可用的PointT类型: PointXYZ——成员变量:float x,y,z; PointXYZ是使用最常见的一个点数据类型,因为他之包含三维XYZ坐标信息,这三个浮点数附加一个浮点数来满足 ...

  9. 动态规划--电路布线(circuit layout)

    <算法设计与分析>  --王晓东 题目描述: 在一块电路板的上.下2端分别有n个接线柱.根据电路设计,要求用导线(i,a(i))将上端接线柱与下端接线柱相连,其中a(i)表示上端点i对应的 ...

  10. [技术选型] SSH/SSI框架替代品

    1.Nutz 简介:http://blog.csdn.net/u012373523/article/details/16993859 官网:http://www.nutzam.com/ 2.