oc开发-线程的多种实现方式

什么是线程

线程:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

为什么使用多线程

多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径,也就是能够产生多条路径来执行代码块

三种多线程的编程方式

一.NSThread

NSThread有两种创建方法,一种是类方法,一种是实例方法,类方法创建的时候需要确定好执行的任务,没有任何返回,它会自己创建一个新线程去执行指定任务,而用实例方法则需要我们手动开启这个线程。创建的时候我们既可以使用SEL也可以使用Block。

1.类方法

[NSThread detachNewThreadSelector:@selector(outPutLog:) toTarget:self withObject:@"类方法创建线程"];//这是使用SEL方法

[NSThread detachNewThreadWithBlock:^{

        NSLog(@"用类方法创建线程成功");

    }];//这是Block方法

2.实例方法

NSThread *thre=[[NSThread alloc] initWithTarget:self selector:@selector(outPutLog:) object:@"实例方法创建线程"];//这是使用SEL方法

NSThread *threa=[[NSThread alloc] initWithBlock:^{

        NSLog(@"实例方法创建线程");

    }];//这是Block方法

[thread start];//启动线程

[thre start];

3.另外一种创建线程的方式

[self performSelectorInBackground:@selector(outPutLog:) withObject:@"创建后台线程"];

二.GCD

Grand Central Dispatch (GCD)宏伟的中枢调度,是一种基于C语言的并发编程技术。它是苹果为多核的并行运算提出的解决方案,会自动调度系统资源,所以它的效率很高。

GCD并不直接操作线程,而是操作队列和任务。我们只需要把任务添加到队列里面,然后指定任务执行的方式,GCD就会自动调度线程执行任务

串行队列

dispatch_queue_t serialQuene = dispatch_queue_create( "my_serial_queue" , DISPATCH_QUEUE_SERIAL);

并行队列

dispatch_queue_t currentQuene = dispatch_queue_create( "my_concurrent_queue" , DISPATCH_QUEUE_CONCURRENT);

同步操作

dispatch_sync(serialQuene, ^{

      要执行的代码

    });

异步操作

dispatch_async(currentQuene, ^{

      要执行的代码

    });

注:同步操作不管加入到何种队列,只会在主线程按顺序执行;异步操作只在非主线程的线程执行,在串行队列中异步操作会在新建的线程中按顺序执行;异步操作,并行队列,理论上并行队列会给每一个异步操作新建线程,然后让所有的任务并发执行。但是实际上系统能创建的线程数量是有限的,当创建的线程达到最大线程数以后,后面的异步操作就需要等待前面的操作执行完毕才能得到执行。哪个线程操作执行完毕,就把等待的异步任务安排到哪个线程。直到所有的操作执行完毕。

三.NSOperation&NSOperationQueue

虽然GCD的功能已经很强大了,但是它使用的API依然是C语言的。在某些时候,在面向对象的objective-c中使用起来非常的不方便和不安全。

所以苹果公司把GCD中的操作抽象成NSOperation对象,把队列抽象成NSOperationQueue对象。

1.向主队列中添加操作

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

                self.resultMessage.stringValue=[NSString stringWithFormat:@"当前线程信息:%@,第%d次循环\n",[NSThread currentThread],i+1];

            }];//向主队列中添加操作都会放到主线程中执行

2.向非主队列中添加操作

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

            [notMainQueue addOperationWithBlock:^{

                self.resultMessage.stringValue=[NSString stringWithFormat:@"当前线程信息:%@,第%d次循环\n",[NSThread currentThread],i+1];

            }];//以块的方式添加操作

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

  [self operationAction:@ "这是NSBlockOperation" ];

}];

[notMainQueue addOperation:op];//添加NSBlockOperation对象

3.添加操作的方式

- (void)addOperation:(NSOperation *)op;

- (void)addOperationWithBlock:(void (^)(void))block

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值