漫谈多线程

Posted 奈文摩尔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漫谈多线程相关的知识,希望对你有一定的参考价值。

一.多线程实现方案

1>pthread

  1)语言:C语言

  2)特点: (1)通用的多线程API

      (2)适用于Unix\Linux\Windows等

      (3)跨平台\可移植

      (4)使用难度大

  3)生命周期:程序员管理 

示例:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //1.创建一个pthread对象
    pthread_t thread;
    
    //2.创建线程
    /*
     第一个参数:线程对象,需要传地址
     第二个参数:线程的一些属性,可以传NULL
     第三个参数:该线程创建后要调用的方法,注意这里是一个指向函数的指针
     第四个参数:第三个参数(函数指针)中接收的参数,如果没有那么传NULL
     */
    pthread_create(&thread, NULL, run, NULL);
    
    pthread_t thread2;
    pthread_t thread3;
    pthread_create(&thread2, NULL, run, NULL);
    pthread_create(&thread3, NULL, run, NULL);
}

void *run(void * param)
{
    NSLog(@"--run--%@",[NSThread currentThread]);
    return NULL;
}

 

 

2>NSThread

  1)语言:OC语言

  2)特点: (1)可以对线程状态操作,简单易用

      (2)使用更加面向对象

  3)生命周期:程序员管理

注意的地方:

 1)创建线程的四种方法 alloc initwith..|detachNewThread|performSelectorInBack..|自定义

 2)设置线程的属性(名称&优先级[0.0~1.0])

 3)NSThread创建线程的生命周期:当任务执行完毕的时候被释放

3>GCD(任务+队列)

  1)语言:C语言

  2)特点: (1)能够充分利用设备多核,并且是自动的

      (2)旨在替代NSThread等线程技术

  3)生命周期:自动管理

注意的地方:

1)全局并发队列,是系统自带的队列,需要的时候调用即可,一共有四种,它们的优先级是默认存在的.苹果官方文档指出,栅栏函数对它们无效.

2)主队列,凡是添加到主队列中的任务都是在主线程中执行的.

3)使用步骤:封装任务-->把任务丢给队列,系统会按照FIFO原则把任务给对应的线程处理

4)同步函数+串行队列 -->不会开线程,所有的任务串行执行

   同步函数+并发队列 -->不会开线程,所有的任务串行执行

   同步函数+主队列 -->死锁(因为主队列调度任务时会先检查主线程状态,如果主线程发现忙着会暂停调度,所以这种情况会死锁)

   异步函数+串行队列 -->会开一条线程,所有的任务串行执行

   异步函数+并发队列 -->会开多条线程,所有的任务并发执行

   异步函数+主队列 -->不会开线程,所有的任务串行执行

5)ios6.0之前,creat一次就release一次.iOS6.0之后纳入ARC管理

6)其他常用函数

  ①栅栏函数-->用来控制任务的执行顺序,但是不能用全局并发队列(苹果官方文档是这样说明的)

  ②一次性函数-->整个程序运行中,一次性代码只执行一次,可以用来实现单例模式(注意,不能放到懒加载中)

  ③延迟执行

  ④快速迭代(注意不能使用主队列)

  ⑤队列组的使用

4>NSOpreation(操作+队列)

  1)语言:OC语言

  2)特点: (1)它的底层是基于GCD,比GCD多了一些简单实用功能

      (2)使用更加面向对象

  3)生命周期:自动管理

注意的地方:

1)NSOperation用来封装操作,NSOpreationQueue用来存放任务

2)实现步骤:封装操作--->把操作添加到队列

3)对于NSBlockOperation,可以追加任务,如果一个操作中有多个任务,那么会开子线程,但不一定在子线程中处理

4)自定义NSOpreation --->重写内部的Main方法,有利于代码的封装和复用

5)非主队列同时具备串行和并发功能,默认是并发队列,通过控制最大并发数来实现

6)把操作添加到队列中的方法内部会自动调用start方法

7)队列的挂起:YES-->暂停  , NO-->继续;(挂起只能挂起当前非处于执行状态的任务)

8)队列的取消:取消不可恢复;(苹果官方建议,如果是自定义的NSOpreation,每执行完一段耗时操作,就检查当前操作是否取消)

9)操作的依赖和监听:可以跨队列依赖,注意不要循环依赖就好了

                                                                2016-5-22   奈文摩尔

     

以上是关于漫谈多线程的主要内容,如果未能解决你的问题,请参考以下文章

多线程漫谈

多线程的风险漫谈

漫谈并发编程:线程之间的协作

多线程 Thread 线程同步 synchronized

多个用户访问同一段代码

线程学习知识点总结