(1)首先回答什么是线程

  1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行

  (2)什么是多线程

  1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。
  多线程的作用:更新显示UI界面、处理用户触摸事件。
  (3)Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。
  (4)开发中实现多线程的方案
       1》C语言的POSIX接口:#include<pthread.h>
       2》OC的NSThread
       3》 C语言的GCD接口(性能最好,代码更精简)  
       4》  OC的NSOperation和NSOperationQueue(基于GCD)
  2.线程的通信
  (1)GCD:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// 下载图片

UIImage *image = nil;

dispatch_async(dispatch_get_main_queue(), ^{

// 回到主线程

});

  (2)NSThread的线程通信

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  // 下载图片

  UIImage *image = nil;

  [self performSelector:@selector(settingImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES modes:nil];

   }

  这种情况 也适用于子线程之间的通信。

  (3)NSThread的线程通信

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  // 下载图片

  UIImage *image = nil;

  [self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:YES];

  }

  3.网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题

   利用字典图片地址为key,下载操作为value

  4. 列举cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?

  1》开发中实现多线程的方案

       1》C语言的POSIX接口:#include<pthread.h>
       2》OC的NSThread
       3》 C语言的GCD接口(性能最好,代码更精简)  
       4》  OC的NSOperation和NSOperationQueue(基于GCD)
  2》多线程安全的解决方案
       1》只在主线程刷新访问UI
       2》如果要防止资源抢夺,得用synchronize进行加锁保护。
       3》如果异步操作要保证线程安全等问题,尽量使用GCD。(GCD有些函数默认就是安全的)
  5.GCD内部怎么实现的
    1》 iOS和OSX的核心是XNU内核(苹果电脑发展的操作系统内核),GCD是基于XNU内核实现的。
    2》GCD的API全部在libdispatch库中
    3》GCD的底层实现主要有:Dispatch Queue和Dispatch Source
      Dispatch Queue :管理block操作
      Dispatch Source:处理事件(比如说线程间的通信)
  6.GCD和NSOperationQueue
     1》GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本的封装
     2》GCD只支持FIFO的队列,NSOperationQueue可以很方便的调整执行顺序,可以添加依赖设置最大并发数量。
     3》GCD的执行速度比NSOperationQueue快
     4》NSOperationQueue支持KVO,可以检测Operation是否正在执行,是否结束,是否取消。
  如何进行选择?
  任务之间不太相互依赖,选用GCD;
  任务之间有依赖,或者要监听任务的执行情况:NSOperationQueue

最新文章

  1. 关于Java语言中那些修饰符
  2. ios7 ios8 cell中下划线偏移(separator Insets)处理方法
  3. 贴近用户体验的jQuery日期选择插件
  4. js图片轮播图
  5. Bootstrap与tab组合,切换菜单实例
  6. SKPhysicsJointFixed类
  7. RTP 包格式 详细解析
  8. POJ1502(Dijkstra)
  9. Jenkins + robot framework自动发送邮件报告
  10. Homestead PHP7安装phpredis扩展
  11. Pin学习笔记--安装及一些基本知识
  12. Codeforces 839C Journey【DFS】
  13. shell中awk printf的用法
  14. spring cloud config--client
  15. pyhon----模块导入
  16. 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法
  17. 2012年蓝桥杯省赛A组c++第3题(喝断片的海盗)
  18. python安装pandas和lxml
  19. maven私服的使用
  20. 第32章:MongoDB-索引--Capped固定集合

热门文章

  1. state Threads 开源库介绍
  2. Python translate()方法
  3. vim在vps内的终端内支持molokai
  4. 0x01 译文:Windows桌面应用Win32开发简介
  5. android自定义控件(1)-自定义控件属性
  6. saveFile()方法
  7. java ssm框架入门(三)正式项目的web.xml配置
  8. [systemd]Linux系统启动之systemd
  9. QT在CT上的安装及运行
  10. 华为/中兴 3G 语音的调试