iOS多线程编程之二——NSOperation与NSOperationQueue(二)

简介: iOS多线程编程之二——NSOperation与NSOperationQueue

二、操作之间的依赖关系


依赖关系和优先级的作用很像,却也不同。如果一个操作A依赖于另一个操作B,那么只有当B操作完成后,A操作才会执行。操作添加依赖的


添加一个依赖:


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


删除一个依赖


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

原则上说,一个操作对象的依赖可以添加多个,并且当所有依赖都执行完成后才会执行这个操作。



三、NSOperationQueue操作队列


NSOperationQueue是操作队列类,通过上面的介绍,我们已经可以理解操作,并且操作默认的执行方式是串行的,尽管NSBlockOperation中的block块间是并行执行的,但其和外部操作依然是串行的。如果将操作放入操作队列中,则默认为并行执行的。


示例如下:


- (void)viewDidLoad {

   [super viewDidLoad];

   // Do any additional setup after loading the view, typically from a nib.

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

   NSInvocationOperation * op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(log) object:nil];

   [queue addOperation:op1];

   for (int i=0; i<10; i++) {

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

   }

}


-(void)log{

   for (int i=0; i<10; i++) {

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

   }

}

打印信息如下:




可以看出来,队列的操作是在一个新的线程中执行的,并且操作队列之中的操作也都是异步执行的。



在操作队列中添加一个操作任务:


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


在队列中插入一组操作任务,后面的参数设置是否队列中得任务都执行完成后再执行这一组操作:


- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait;


在队列中添加一个block操作


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


获取操作队列中的所有操作的数组


@property (readonly, copy) NSArray *operations;


获取操作队列中操作的个数


@property (readonly) NSUInteger operationCount;


设置队列最大并行操作数量


@property NSInteger maxConcurrentOperationCount;


设置是否暂停队列任务执行


@property (getter=isSuspended) BOOL suspended;


设置队列名字


@property (copy) NSString *name;


设置队列的优先级别(iOS8后支持)


@property NSQualityOfService qualityOfService;


取消队列中所有操作任务


- (void)cancelAllOperations;


阻塞当前线程,直到队列中所有任务完成


- (void)waitUntilAllOperationsAreFinished;


获取当前执行的队列


+ (NSOperationQueue *)currentQueue;


获取主线程中的操作队列


+ (NSOperationQueue *)mainQueue;


四、队列中操作的执行顺序法则


1、决定于依赖关系,只有当这个操作的依赖全部执行完成后,它才会被执行。


2、影响于优先级,优先级高的会先执行。

目录
相关文章
|
6天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
21 2
|
11天前
|
Java 调度 开发者
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java多线程编程的核心概念和实际应用,通过浅显易懂的语言解释多线程的基本原理,并结合实例展示如何在Java中创建、控制和管理线程。我们将从简单的线程创建开始,逐步深入到线程同步、通信以及死锁问题的解决方案,最终通过具体的代码示例来加深理解。无论您是Java初学者还是希望提升多线程编程技能的开发者,本文都将为您提供有价值的见解和实用的技巧。
15 2
|
13天前
|
Java 数据处理
Java中的多线程编程:从基础到实践
本文旨在深入探讨Java中的多线程编程,涵盖其基本概念、创建方法、同步机制及实际应用。通过对多线程基础知识的介绍和具体示例的演示,希望帮助读者更好地理解和应用Java多线程编程,提高程序的效率和性能。
19 1
|
16天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
6天前
|
Java
COMATE插件实现使用线程池高级并发模型简化多线程编程
本文介绍了COMATE插件的使用,该插件通过线程池实现高级并发模型,简化了多线程编程的过程,并提供了生成结果和代码参考。
|
8天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
9天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
10天前
|
安全 Java 调度
python3多线程实战(python3经典编程案例)
该文章提供了Python3中多线程的应用实例,展示了如何利用Python的threading模块来创建和管理线程,以实现并发执行任务。
12 0
|
11天前
|
存储 缓存 Java
JAVA并发编程系列(11)线程池底层原理架构剖析
本文详细解析了Java线程池的核心参数及其意义,包括核心线程数量(corePoolSize)、最大线程数量(maximumPoolSize)、线程空闲时间(keepAliveTime)、任务存储队列(workQueue)、线程工厂(threadFactory)及拒绝策略(handler)。此外,还介绍了四种常见的线程池:可缓存线程池(newCachedThreadPool)、定时调度线程池(newScheduledThreadPool)、单线程池(newSingleThreadExecutor)及固定长度线程池(newFixedThreadPool)。
|
16天前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
49 0