美文网首页
关于多线程网络,你了解多少?

关于多线程网络,你了解多少?

作者: AI_Eleven | 来源:发表于2016-05-21 11:35 被阅读530次

1. 多线程的底层实现

(1)首先什么是线程

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

(2)什么是多线程

1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。

多线程的作用:更新显示UI界面、处理用户触摸事件。

(3)Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。

(4)开发中实现多线程的方案

1》C语言的POSIX接口:#include

2》OC的NSThread

3》 C语言的GCD接口(性能最好,代码更精简)

4》OC的NSOperation和NSOperationQueue(基于GCD)

2. 线程间怎么通信?

线程间通信的体现

1个线程传递数据给另1个线程

在1个线程中执行完特定任务后,转到另1个线程继续执行任务

有三种分别有GCD,NSThread的线程通信

 ```

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)the withObject:(id)arg waitUntilDone:(BOOL)wait;

 ```


3. GCD和NSOperationQueue与第8个问题其实一样

1》GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本的封装

2》GCD只支持FIFO的队列,NSOperationQueue可以很方便的调整执行顺序,可以添加依赖设置最大并发数量。

3》GCD的执行速度比NSOperationQueue快

4》NSOperationQueue支持KVO,可以检测Operation是否正在执行,是否结束,是否取消。

如何进行选择?

任务之间不太相互依赖,选用GCD;

任务之间有依赖,或者要监听任务的执行情况:NSOperationQueue

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

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

![](media/14637971488015.jpg)

5. 用NSOperation和NSOperationQueue处理A,B,C三个线程,要求执行完A,B后才能执行C,怎么做?

 ```

abjc

// 创建队列

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

// 创建3个操作

NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”operation1---“);

}];

NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”operation1---“);

}];

NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”operation1---“);

}];

// 添加依赖

[c addDependency:a];

[c addDependency:b];

// 执行操作

[queue addOperation:a];

[queue addOperation:b];

[queue addOperation:c];

 ```


6. 列举常见多线程的实现,并谈谈多线程安全的几种解决方法及多线程安全怎么控制?

1> 只在主线程刷新访问UI

2> 如果要防止资源抢夺,得用synchronized进行加锁保护

3> 如果异步操作要保证线程安全等问题, 尽量使用GCD(有些函数默认就是安全的)

7. GCD内部实现

1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的

2> GCD的API全部在libdispatch库中

3> GCD的底层实现主要有Dispatch Queue和Dispatch Source

l Dispatch Queue :管理block(操作)

l Dispatch Source :处理事件

8. 你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方

1》GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本的封装

2》GCD只支持FIFO的队列,NSOperationQueue可以很方便的调整执行顺序,可以添加依赖设置最大并发数量。

3》GCD的执行速度比NSOperationQueue快

4》NSOperationQueue支持KVO,可以检测Operation是否正在执行,是否结束,是否取消。

如何进行选择?

任务之间不太相互依赖,选用GCD;

任务之间有依赖,或者要监听任务的执行情况:NSOperationQueue

9既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?

Block的使用注意:

1> block的内存管理

2> 防止循环retian

l 非ARC(MRC):__block

l ARC:__weak\__unsafe_unretained

10. 在异步线程中下载很多图片,如果失败了,该如何处理?请结合RunLoop来谈谈解决方案.(提示:在异步线程中启动一个RunLoop重新发送网络请求,下载图片)

1> 重新下载图片

2> 下载完毕, 利用RunLoop的输入源回到主线程刷新UIImageView

11. Socket的实现原理及Socket之间是如何通信的

Socket 中的TCP的三次握手建立连接详解

1.客户端向服务器发送一个SYN J(消息请求)

2.服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1(消息请求回复)

3.客户端再向服务器发一个确认ACK K+1(消息请求会回复确认)

![](media/14637988512800.jpg)

socket中的TCP(传输控制协议)的四次挥手释放连接

1.某个应用进程首先调用active close主动关闭连接,这时TCP发送一个FIN M(结束);

2.另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;

3.一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;

4.接收到这个FIN的源发送端TCP对它进行确认。

相关文章

  • 关于多线程网络,你了解多少?

    1. 多线程的底层实现 (1)首先什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进...

  • iOS底层探索之多线程(十四)—关于@synchronized锁

    对于多线程你了解多少?对于锁你又了解多少?锁的原理你又知道吗? iOS底层探索之多线程(一)—进程和线程[http...

  • iOS底层探索之多线程(十五)—@synchronized源码分

    对于多线程你了解多少?对于锁你又了解多少?锁的原理你又知道吗? iOS底层探索之多线程(一)—进程和线程[http...

  • 关于爱情,你知道多少?

    关于爱情,你了解多少呢?

  • IOS线程

    IOS线程 本来想先来总结一下关于网络编程的知识,但是写着写着就成了多线程的知识,那算了,因为网络之前必须了解多线...

  • 2021年广东省网络教育招生指南

    近年来,网络教育以时间自由、地点自由、国家承认等特点,受到在职人员的青睐。那么,关于网络教育你了解多少呢? 一、什...

  • 关于多线程你知道多少

    我们就从线程的创建方式开始吧,那么常见的线程创建方式有哪几种呢?1. 通过继承 Thread 类 2. 通过实现 ...

  • Java 多线程

    1 多线程 1.1 多线程介绍   学习多线程之前,我们先要了解几个关于多线程有关的概念。  进程:进程指正在运行...

  • 关于“改变” 你了解多少

    关于改变,我说说我从哪些地方获得过内容信息 最开始是之前学习“如何高效学习”这个主题时,从好几本书里知道一些重要理...

  • 关于梦,你了解多少?

    在这次的学习中,我知道了梦存在的意义。有人会说,多梦不好,噩梦会影响睡眠质量等等。 梦来自右脑的语言。 弗洛伊德在...

网友评论

      本文标题:关于多线程网络,你了解多少?

      本文链接:https://www.haomeiwen.com/subject/optorttx.html