多线程相关的笔记

///直接使用系统的定义的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; 获取主队列。



**/

转载于:https://my.oschina.net/jesonzhang/blog/2253793

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值