iOS中实现多线程的技术方案

本文详细介绍了多线程技术在iOS开发中的应用,包括pthread、NSThread和GCD三种实现方式,对比不同方法的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pthread 实现多线程操作


代码实现:


void * run(void *param)

{

    for (NSInteger i = 0; i < 1000; i ) {

        NSLog(@"---buttonclick---%zd---%@", i, [NSThread currentThread]);

    }


    return NULL;

}


@implementation ViewController


- (IBAction)clickButton:(id)sender {

    // 定义一个线程

    pthread_t thread;


    // 创建一个线程  (参1)pthread_t *restrict:创建线程的指针,(参2)const pthread_attr_t *restrict:线程属性  (参3)void *(*)(void *):线程执行的函数的指针,(参4)void *restrict:null

    pthread_create(&thread, NULL, run, NULL);


    // 何时回收线程不需要你考虑

    pthread_t thread2;


    pthread_create(&thread2, NULL, run, NULL);


}

NSThread实现多线程


一个 NSThread 对象就代表一条线程


创建线程的多种方式


第一种方式:先创建再启动线程


  // 创建线程

  NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];


  // 线程启动了,事情做完了才会死, 一个NSThread对象就代表一条线程

  [thread start];

第二种:直接创建并启动线程


  // 直接创建并启动线程

  [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"jack"];

第三种:


  // 直接创建并启动线程

  [self performSelectorInBackground:@selector(run:) withObject:@"jack"];


  // 使线程进入阻塞状态

  [NSThread sleepForTimeInterval:2.0];


  #pragma mark - 执行run方法

  - (void)run:(NSString *)param

  {

      // 当前线程是否是主线程

      for (NSInteger i = 0; i < 100; i ) {

          NSLog(@"---%@---%zd---%d", [NSThread currentThread], i,  [NSThread isMainThread]);

      }

  }

方法2和方法3的优点:快捷 方法1的优点:可以轻松拿到线程


线程间通信


线程间通信的体现

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


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


线程间通信的常用方法:小程序图片下载


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

{

    // 获取图片的url

    NSURL *url = [NSURL URLWithString:@"http://7xjanq.com1.z0.glb.clouddn.com/6478.jpg"];

// 另开1条线程 object用于数据的传递

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(downLoadWithURL:) object:url];

    // 由于下面下载图片的耗时太长,应领开启线程来完成

    [thread start];

}


// 下载图片

- (void)downLoadWithURL:(NSURL *)url

{

    NSLog(@"%@", [NSThread currentThread]);

    // 下载图片

    NSData *data = [NSData dataWithContentsOfURL:url];

    // 生成图片

    UIImage *image = [UIImage imageWithData:data];


    // 返回主线程显示图片

    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

}

以上两种方式使用线程已经过时了,开发中我们操作线程大多都使用 GCD 和 NSOperation 来实现多线程操作。


下面我就给大家系统的介绍一下 GCD 是如何实现多线程的


GCD 实现多线程


GCD 简介


GCD 全称是Grand Central Dispatch,可译为“超级厉害的中枢调度器”,GCD 是苹果公司为多核的并行运算提出的解决方案, GCD会自动利用更多的 CPU 内核(比如双核、四核)来开启线程执行任务,GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程),不需要我们程序员手动管理内存。


任务和队列


任务:在同步函数和异步函数中执行


队列:用来存放任务(并发 串行)


GCD会自动将队列中的任务取出,放到对应的线程,任务的取出遵循FIFO,即先入先出队列,First Input First Output 的缩写。先进入的任务先完成并结束,再执行后面的任务。


同步函数和异步函数,并发队列和串行队列


用同步的方式执行任务:在当前线程中可立即执行任务,不具备开启线程的能力


用异步的方式执行任务:在当前线程结束时执行任务,具备开启新的线程的能力


并发队列:允许多个任务同时执行


串行队列:一个任务执行完毕后,再执行下一个任务

创建并发/串行队列代码:


// 创建并发队列 

// 参1:const char *label 队列名称 

// 参2:dispatch_queue_attr_t attr 队列类型

dispatch_queue_t queueConcurrent = dispatch_queue_create("520it.com", DISPATCH_QUEUE_CONCURRENT);


// 创建串行队列  serial 串行  concurrent并发

dispatch_queue_t queueSerial = dispatch_queue_create("520it.com", DISPATCH_QUEUE_SERIAL);


// 获取全局队列 全局队列是并发队列 

// 参1:队列的优先级 

// 参2:0(以后可能用到的参数)

dispatch_queue_t queueGlobal = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


// 全局并发队列的优先级

#define DISPATCH_QUEUE_PRIORITY_HIGH 2 // 高

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认(中)

#define DISPATCH_QUEUE_PRIORITY_LOW (-2) // 低

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN // 后台


// 获取主队列  在主队列中的任务都会在主线程中执行。

dispatch_queue_t queueMain = dispatch_get_main_queue();

同步/异步函数代码表示:


// GCD同步函数串行队列(立即执行,当前线程) 

// 参1: dispatch_queue_t queue 队列 

// 参2: 任务

dispatch_sync(queueSerial, ^{

    for (NSInteger i = 0; i < 10; i ) {

        NSLog(@"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值