///直接使用系统的定义的GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
///耗时线程
for (int ii=0; ii<100; ii++) {
NSLog(@"22222");
}
///回归主线程
dispatch_async(dispatch_get_main_queue(), ^{
});
});
// /////--------自己定义线程---------------------- //DISPATCH_QUEUE_SERIAL 串行 //DISPATCH_QUEUE_CONCURRENT 并行 dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"=====开始=====");
dispatch_async(queue, ^{
NSLog(@"11111");
});
dispatch_async(queue, ^{
NSLog(@"2222222");
});
//前面执行完成在执行此函数,然后在执行后面的
dispatch_barrier_async(queue, ^{
NSLog(@"前面执行完成在执行此线程,完了再执行后面的");
});
dispatch_async(queue, ^{
NSLog(@"3333333");
});
dispatch_async(queue, ^{
NSLog(@"444444");
});
NSLog(@"=====结束=====");
// /////只会执行一次 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"=====只会执行一次====="); });
// // ////cgd线程组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"=====线程组1=====");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"=====线程组2=====");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"=====线程组3=====");
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"=====线程组4=====");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"=====前面执行完成这里才会执行的=====");
});
//---------------------NSOperation和NSOperationQueue------------------------------------
NSInvocationOperation *inc = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runTask) object:nil];
[inc start];
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"-----blockOperation-----这个是线程");
}];
///还可以添加额外的线程
[blockOperation addExecutionBlock:^{
NSLog(@"--1---addExecutionBlock-----这个是线程");
}];
[blockOperation addExecutionBlock:^{
NSLog(@"-2----addExecutionBlock-----这个是线程");
}];
[blockOperation addExecutionBlock:^{
NSLog(@"--3---addExecutionBlock-----这个是线程");
}];
[blockOperation start];
//----------自定义-------------------
@interface YSCOperation : NSOperation
@end
@implementation YSCOperation
-
(void)main { if (!self.isCancelled) {
for (int i = 0; i < 5; i++) { [NSThread sleepForTimeInterval:2]; NSLog(@"1---%@", [NSThread currentThread]); }
}
}
@end
YSCOperation *yscOperation = [[YSCOperation alloc] init];
[yscOperation start];
//---------------------------
/////使用队列 /** 凡是添加到主队列中的操作,都会放到主线程中执行(注:不包括操作使用addExecutionBlock:添加的额外操作,额外操作可能在其他线程执行,感谢指正)。 添加到自定义队列这种队列中的操作,就会自动放到子线程中执行。 */
//主队
// NSOperationQueue *operationQueue = [NSOperationQueue mainQueue]; //自定义队列 NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"-----operationQueue----1");
}];
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"-----operationQueue----2");
}];
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"-----operationQueue----3");
}];
//默认为-1,不受限制
operationQueue.maxConcurrentOperationCount = 5;
// 设置依赖关系:依次执行1,2,3
[blockOperation3 addDependency:blockOperation2];
[blockOperation2 addDependency:blockOperation1];
//设置优先级,但不和依赖关系公用,
// blockOperation1.queuePriority = NSOperationQueuePriorityHigh;
[operationQueue addOperation:blockOperation1];
[operationQueue addOperation:blockOperation2];
[operationQueue addOperation:blockOperation3];
//========线程通讯==
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 1.创建队列
NSOperationQueue *queueTemp = [[NSOperationQueue alloc]init];
// 2.添加操作
[queueTemp addOperationWithBlock:^{
// 异步进行耗时操作
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"1---%@", [NSThread currentThread]); // 打印当前线程
}
// 回到主线程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 进行一些 UI 刷新等操作
for (int i = 0; i < 2; i++) {
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"2---%@", [NSThread currentThread]); // 打印当前线程
}
}];
}];
});
//----------------------------
/**
self.lock = [[NSLock alloc] init]; // 初始化 NSLock 对象
// 加锁
[self.lock lock];
// 解锁
[self.lock unlock];
线程安全解决方案:可以给线程加锁,在一个线程执行该操作的时候,不允许其他线程进行操作。iOS 实现线程加锁有很多种方式。@synchronized、 NSLock、NSRecursiveLock、NSCondition、NSConditionLock、pthread_mutex、dispatch_semaphore、OSSpinLock、atomic(property) set/ge等等各种方式。这里我们使用 NSLock 对象来解决线程同步问题。NSLock 对象可以通过进入锁时调用 lock 方法,解锁时调用 unlock 方法来保证线程安全。
NSOperation、NSOperationQueue 常用属性和方法归纳
10.1 NSOperation 常用属性和方法
取消操作方法
- (void)cancel; 可取消操作,实质是标记 isCancelled 状态。
判断操作状态方法
- (BOOL)isFinished; 判断操作是否已经结束。
- (BOOL)isCancelled; 判断操作是否已经标记为取消。
- (BOOL)isExecuting; 判断操作是否正在在运行。
- (BOOL)isReady; 判断操作是否处于准备就绪状态,这个值和操作的依赖关系相关。
操作同步
- (void)waitUntilFinished; 阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。
- (void)setCompletionBlock:(void (^)(void))block; completionBlock 会在当前操作执行完毕时执行 completionBlock。
- (void)addDependency:(NSOperation *)op; 添加依赖,使当前操作依赖于操作 op 的完成。
- (void)removeDependency:(NSOperation *)op; 移除依赖,取消当前操作对操作 op 的依赖。
@property (readonly, copy) NSArray<NSOperation *> *dependencies; 在当前操作开始执行之前完成执行的所有操作对象数组。
10.2 NSOperationQueue 常用属性和方法
取消/暂停/恢复操作
- (void)cancelAllOperations; 可以取消队列的所有操作。
- (BOOL)isSuspended; 判断队列是否处于暂停状态。 YES 为暂停状态,NO 为恢复状态。
- (void)setSuspended:(BOOL)b; 可设置操作的暂停和恢复,YES 代表暂停队列,NO 代表恢复队列。
操作同步
- (void)waitUntilAllOperationsAreFinished; 阻塞当前线程,直到队列中的操作全部执行完毕。
添加/获取操作`
- (void)addOperationWithBlock:(void (^)(void))block; 向队列中添加一个 NSBlockOperation 类型操作对象。
- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait; 向队列中添加操作数组,wait 标志是否阻塞当前线程直到所有操作结束
- (NSArray *)operations; 当前在队列中的操作数组(某个操作执行结束后会自动从这个数组清除)。
- (NSUInteger)operationCount; 当前队列中的操作数。
获取队列
+ (id)currentQueue; 获取当前队列,如果当前线程不是在 NSOperationQueue 上运行则返回 nil。
+ (id)mainQueue; 获取主队列。
**/