美文网首页
多线程之概念及常用线程的API

多线程之概念及常用线程的API

作者: 需要药 | 来源:发表于2017-12-04 15:17 被阅读0次

    demo(自定义NSOperation子线程) 地址: github.com/lizhaojie/study_api.git

    概念一:进程,线程

    进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内

    线程:一个进程里至少有一条线程,在线程中执行任务

    多线程原理:同一时间,CPU只能处理一条线程,多线程并发执行,其实是CPU快速的在多线程间切换,如果CPU切换线程的时间足够快,就造成了并发执行的假象。

    多线程优点:能适当提高程序的执行效率,适当提高资源利用率(CPU,内存利用率)

    多线程缺点:开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程512KB),如果开启大量的线程,会占用大量的内存空间,降低程序性能

    另外线程越多,CPU在切换线程上的开销越大,程序设计也更加复杂:线程之间的通信,多线程的数据共享

    概念二:队列

    队列的类型

    1>.全局队列:获取方法dispatch_get_global_queue

    所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)

    2>.串行队列: 创建方法dispatch_queue_create("oneQueue", DISPATCH_QUEUE_SERIAL)

    3>.主队列: 获取方法dispatch_get_main_queue

    添加到主队列的任务都在主线程中执行

    常用API:

    1.performSelectorInBackground:@selector() withObject:nil;

    作用:新创建一条线程,异步执行

    2.NSThread:(基于oc语言,生命周期手动管理)

    类方法:detachNewThreadSelector:@selector(selectorName) toTarget:selfwithObject:nil

    实例方法:initWithTarget:selfselector:@selector(selectorName) object:nil,

    创建一个线程

    需调用start方法开启线程

    创建并启动一个线程

    3. GCD:(基于c语言,生命周期自动管理,充分利用设备的多核特性)dispatch_asyn/dispatch_syn : 异步/同步执行

    dispath_syn:不论什么队列,都不会创建新的线程,都在当前线程中执行

    dispatch_asyn:肯定会开线程,当是全局队列时会开N条线程,串行队列时,只开1条线程

    4.NSOperation:(基于oc语言,生命周期自动管理,底层是GCD,比GCD多了一些简单使用的功能,使用更加面向对象)

    NSOperation是抽象类,不能直接使用,只能使用它的子类 (NSInvocationOperation,NSBlockOpertion,继承自NSOperation的子类)

    NSInvocationOperation:可以脱离队列来执行任务,NSInvocationOperation是用来封装任务的,如果调用start方法,则会把任务放到主线程调用;只有放到队列中才在子线程执行;

    NSBlockOperation也可以脱离队列来执行任务,一个操作可以有多个任务,每个操作的第一个任务是在主线程执行;而且还可以追加任务,追加的任务是在子线程执行

    NSOperationQueue:只要是自己创建的队列,则任务就会在子线程中执行,而且是默认并发执行,除非最大并发数设置为1

    相关文章

      网友评论

          本文标题:多线程之概念及常用线程的API

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