线程问题

1.

谈谈你对多线程开发的理解?iOS中有几种实现多线程的方法,并说明每种方式有什么特点?

:使用多线程开发的好处:
1、使用线程可以把程序中占据时间长的任务放到后台去处理,如网络数据的请求、图片、视频的下载
2、发挥多个处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好
缺点:1、大量的线程降低代码的可读性
         2、更多的线程需要更多的内存空间
3、当多个线程对同一个资源同时进行访问的时候,会出现资源争夺的情况,这个时候要注意线程的安全。
1、NSThread(两种创建方式)

优点:NSThread比其他两个轻量级,使用简单。

缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销。
脱离线程:
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
非脱离线程:
NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];

2、NSOperationQueue
NSOperationQueue是面向对象的,不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。

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

  • oprationQueue addOperationWithBlock:^{

//这个block语句块在子线程中执行

}

3、Grand Central Dispatch (GCD)
GCD是基于C语言的,苹果开发的一个多核编程的解决方案,iOS4之后才能使用,GCD更接近底层,但是从异步操作之间的事务性、顺序性、依赖关系,GCD需要自己写更多的代码来实现,而NSOperation以及内建了这些支持。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 耗时的操作

    dispatch_async(dispatch_get_main_queue(), ^{

        // 更新界面

 });

});

PS:不显示的创建线程的方法:
用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

2.

线程与进程的区别和联系?

:1.线程是CPU独立运行和独立调度的基本单位

               进程是资源分配的基本单位

               进程和线程都是由操作系统所运行的程序运行的基本单元,

        2、区别:

               进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响

               线程只是一个进 程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉

               多进程的程序要比多线程的程序健 壮,但在进程切换时,耗费资源较大,效率要差些

               对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

     

3.

简述多线程的作用以及什么地方会用到多线程?OC实现多线程的方法有哪些?谈谈多线程安全问题的几种解  决方案?何为线程同步,如何实现的?分线程回调主线程方法是什么,有什么作用?

(1)、多线程的作用:可以解决负载均衡问题,充分利用cpu资源 。为了提高CPU的使用率,采用多线程的方式去同时完 成几件事情而互不干扰,

(2)、大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文 件、视频图像的采集、处理、显示、保存等。

(3)、ios有三种主要方法:1、NSThread。2、NSOperation。3、GCD。

(4)解决方案:使用锁:锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正 确性。使用POSIX互斥锁;使用NSLock类;使用@synchronized指令等。

(5)回到主线程的方法: dispatch_async(dispatch_get_main_queue(), ^{ });

作用:主线程是显示UI界面,子线程多数是进行数据处理 

4.

多线程是什么 
答:
多线程是个复杂的概念,按字面意思是同步完成多项任务,提高了资源的使用效率,从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色;从操作系统角度,是多任务,现在用的主流操作系统都是多任务的,可以一边听歌、一边写博客;对于应用来说,多线程可以让应用有更快的回应,可以在网络下载时,同时响应用户的触摸操作。在iOS应用中,对多线程最初的理解,就是并发,它的含义是原来先做烧水,再摘菜,再炒菜的工作,会变成烧水的同时去摘菜,最后去炒菜。
 
 
 5.谈谈你对串行和并发,同步和异步的了解
 
 答:
串行队列中的任务会按顺序执行
并行队列中的任务通常会并发执行,而且无法确定任务的执行顺序
 
在串行队列中执行同步任务:不会新建线程,按顺序执行任务(毫无用处)
在串行队列中执行异步任务,会新建线程,按顺序执行任务(非常有用)
 
在并行队列中执行同步任务:不会新建线程,按顺序执行任务(几乎没用)
在并行队列中执行异步任务:会新建多个线程,但是无法确定任务的执行顺序(有用,但是很容易出错)
 
dispatch_async表示异步操作,异步操作会新开辟线程来执行任务,而且无法确定任务的执行顺序
dispatch_sync表示同步操作,同步操作不会新开辟线程
 
线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 ,串行执行任务
线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制,并行执行任务 1.2.3模式使用GCD的主队列.使用NSOperationQueue,把最大线程数(并发)设为1
 
6.

IOS中如何实现多线程的同步?

答:

一个进程启动的多个不相干线程,它们相互之间关系为异步。

      同步的话指的是多线程同时操作一个数据 这个时候需要对数据添加保护 这个保护就是线程的同步。

       用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,如果任务1不完成,那么任务2就不会开始,这就是同步

7.

什么是RunLoop?

   答:  一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。使用RunLoop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。runloop的设计是为了减少cpu无谓的空转。RunLoop的使用场合:

1、使用端口或自定义输入源和其他线程通信;

2、子线程中使用了定时器;

3、Cocoa中使用任何performSelector到了线程中运行方法;

4、使线程执行周期性任务。仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个 RunLoop。

原文地址:https://www.cnblogs.com/jinchengvs/p/4836838.html