文档章节

多线程的底层实现机制

万能的匹诺曹
 万能的匹诺曹
发布于 2016/06/22 16:14
字数 768
阅读 45
收藏 3

1.多线程的底层实现

(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

© 著作权归作者所有

下一篇: Carbon是什么?
万能的匹诺曹
粉丝 3
博文 20
码字总数 16971
作品 0
海淀
高级程序员
私信 提问
一年走向【Java架构师】之葵花宝典

大多数时候,不是我们不努力,而是不知从何下手,我深知一份好的学习资料是多么的重要,我们通常会把大量的时间都浪费在找资源上,本人搜集学习java架构师的经典学习路线如下可供参考!!! 一...

我一路狂奔
2017/05/20
632
1
JAVA 并发编程实践 - 原子变量与非阻塞同步机制 笔记

非阻塞算法: 利用底层的源自机器指令(比如CAS)代替锁来实现数据在并发访问中的一致性。应用于:操作系统和JVM中实现线程/进程调度机制,垃圾回收机制以及锁和其他并发数据结构。 与基于锁的方...

pczhangtl
2014/01/20
267
1
纯用户空间抢占式多线程的设计

纯用户空间的抢占式多线程库其实是很麻烦的一件事,在设计之前首先必须明白抢占式多线程的意义,其本质就是古老的unix多道程序设计,策略可以是分时的,也可以是其它任何的调度策略,不管什么...

晨曦之光
2012/04/10
325
0
3.JUC线程高级-同步容器 ConcurrentHashMap

Java5.0 在java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。 ConcurrentHashMap 同步容器类是Java5 增加的一个线程安全的哈希表。对于多线程的操作,介于HashMap与Has...

潘天涯
2018/09/04
0
0
Android 使用Messenger跨进程通信框架

一.通过Binder绑定形式的通信 上一篇说道Binder机制的通信框架,也说过Messenger的底层实现自AIDL,因此对于跨进程通信中,Messenger是一种比较高级的框架,可以说对于一个app开发者来说重要性...

IamOkay
2014/12/04
254
0

没有更多内容

加载失败,请刷新页面

加载更多

从零基础到拿到网易Java实习offer,我做对了哪些事

作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到...

Java技术江湖
昨天
4
0
程序性能checklist

程序性能checklist

Moks角木
昨天
6
0
VUE 计算属性

本文转载于:专业的前端网站▶VUE 计算属性 1、示例代码 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <title>vue示例</title> </hea......

前端老手
昨天
5
0
快速搭建LNMT平台和环境部署 Tomcat详解

Tomcat部署的基本概念 1. CATALINA_HOME与CATALINA_BASE分别指什么?     CATALINA_HOME指的是Tomcat的安装目录     bin:\\Tomcat一些脚本存放目录,比如启动脚本startup.bat/start...

网络小虾米
昨天
6
0
float浮动

float浮动 float浮动概念及原理: 文档流:文档流是文档中可显示对象在排列时所占用的位置。 加浮动的元素,会脱离文档流,会沿父容器靠左或靠右排列,如果之前已经有浮动的元素,会挨着浮动...

studywin
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部