最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

IOS開發(fā)-多線程隊(duì)列測試代碼

 更新時(shí)間:2017年09月30日 08:33:07   作者:chenhh6701  
這篇文章中,我不會(huì)說多線程是什么、線程和進(jìn)程的區(qū)別、多線程有什么用,當(dāng)然我也不會(huì)說什么是串行、什么是并行等問題,這些我們應(yīng)該都知道的。

直接貼測試代碼了。

當(dāng)前考慮的問題:
1.隊(duì)列有多少個(gè)消費(fèi)者
2.添加到隊(duì)列的新task是同步運(yùn)行(當(dāng)前線程阻塞)還是異步(當(dāng)前線程不阻塞)
3.多個(gè)隊(duì)列之間的調(diào)度(此文章未涉及)

//
// 單線程和多線程并發(fā)隊(duì)列測試(同步和異步)
//
// 基礎(chǔ)原理:
// 1)隊(duì)列:
//  1.1 dispatch_queue_t 是一個(gè)隊(duì)列,一個(gè)FIFO的消費(fèi)隊(duì)列
//  1.2 消費(fèi)者:隊(duì)列配置的運(yùn)行線程
//  1.3 被消費(fèi)對(duì)象: 添加到隊(duì)列中的運(yùn)行任務(wù)(block等)
//  1.4 運(yùn)行任務(wù):將任務(wù)放到隊(duì)列中,等待消費(fèi)者消費(fèi)
// 2)同步,異步  (對(duì)于任務(wù)) (此處的運(yùn)行指將任務(wù)發(fā)入到請(qǐng)求隊(duì)列中)
//  2.1 同步:A任務(wù)在運(yùn)行時(shí),插入B任務(wù),A任務(wù)等待B任務(wù)運(yùn)行完才能運(yùn)行
//  2.2 異步: A任務(wù)在運(yùn)行時(shí),插入B任務(wù),A任務(wù)不等待并且繼續(xù)運(yùn)行,B任務(wù)也運(yùn)行
// 假設(shè):
// ATask: 運(yùn)行fooA的Block
// BTask: 運(yùn)行fooB的Block
//
//
// 總結(jié):
// 不管單線程或多線程,同步或異步,一定要聯(lián)系請(qǐng)求隊(duì)列考慮



#import "TestQueueSi.h"

@interface TestQueueSi ()

@property (strong,nonatomic) dispatch_queue_t serialQueue;
@property (strong,nonatomic) dispatch_queue_t concurrentQueue;

@end

@implementation TestQueueSi


- (instancetype)init {
  self = [super init];
  if(self) {
    _serialQueue = dispatch_queue_create("chenhh.serialQueue", DISPATCH_QUEUE_SERIAL);
    _concurrentQueue = dispatch_queue_create("chenhh.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

  }
  return self;
}

/**
 QUEUE_SERIAL(單線程) 同步
 死鎖崩潰
 
 1.ATask運(yùn)行,同步加入BTask
 2.BTask加入到請(qǐng)求隊(duì)列中,可是沒有其他空余線程(ATask線程在 等待BTask),BTask等待空余線程,
 3.死鎖發(fā)生
 
 */
- (void)testSerialQueueSync {
  dispatch_sync(_serialQueue,^{
    [self fooA];
    dispatch_sync(_serialQueue,^{
       [self fooB];
    });
    [self fooA];
  });
}

/**
 QUEUE_CONCURRENT(多線程) 同步
 正常運(yùn)行

 1.ATask運(yùn)行,同步加入BTask,Atask線程等待
 2.BTask加入到請(qǐng)求隊(duì)列中,有其他空余線程(ATask線程在等待BTask),BTask運(yùn)行
 3.BTask運(yùn)行結(jié)束,ATask停止等待,繼續(xù)運(yùn)行
 
 */
- (void)testConcurrentQueueSync {
  dispatch_sync(_concurrentQueue,^{
    [self fooA];
    NSLog(@"first");
    
    // 同步 需要等待運(yùn)行結(jié)果
    dispatch_sync(_concurrentQueue,^{
      [self fooB];
    });
    
    // 等待同步代碼完成,再運(yùn)行
    [self fooA];
  });
}

/*
 QUEUE_SERIAL(單線程) 異步
 正常
 
 
 1.ATask運(yùn)行,異步加入BTask,Atask線程繼續(xù)運(yùn)行不等待
 2.BTask加入到請(qǐng)求隊(duì)列中,沒有其他空余線程(ATask線程在正常運(yùn)行),BTask等待空余
 3.ATask運(yùn)行完成,線程空出,BTask運(yùn)行
 
 */
- (void)testSerialQueueAsync {
  dispatch_async(_serialQueue,^{
    [self fooA];
    dispatch_async(_serialQueue,^{
      [self fooB];
    });
     [self fooA];
  });
}

/**
 QUEUE_CONCURRENT(多線程) 異步
 正常運(yùn)行
 
 1.ATask運(yùn)行,同步加入BTask,Atask線程繼續(xù)運(yùn)行不等待
 2.BTask加入到請(qǐng)求隊(duì)列中,有其他空余線程(ATask等線程在正常運(yùn)行),BTask運(yùn)行(ABTask同時(shí)運(yùn)行)
 
 */
- (void)testConcurrentQueueAsync {
  dispatch_async(_concurrentQueue,^{
    [self fooA];
    // 同步 需要等待運(yùn)行結(jié)果
    dispatch_async(_concurrentQueue,^{
      [self fooB];
    });
    
    // 等待同步代碼完成,再運(yùn)行
    [self fooA];
  });
}

- (void)fooA {
  NSLog(@" ************ fooA ************ ");
}

- (void)fooB {
  NSLog(@" ************ fooB ************ ");
}

@end

相關(guān)文章

最新評(píng)論

民权县| 盱眙县| 吉林市| 呼图壁县| 镇康县| 邹城市| 绵阳市| 腾冲县| 女性| 保定市| 襄汾县| 军事| 刚察县| 巫山县| 阳新县| 上栗县| 霍林郭勒市| 阜南县| 寿宁县| 任丘市| 清镇市| 河源市| 郎溪县| 西藏| 古丈县| 鸡西市| 彝良县| 襄垣县| 都匀市| 唐山市| 林周县| 吉林市| 年辖:市辖区| 奉化市| 武鸣县| 长兴县| 四川省| 香格里拉县| 长宁县| 库尔勒市| 汶川县|