//獲取當前線程
[NSThread currentThread]
//獲取主線程
[NSThread mainThread]
// 判斷當前線程是否是主線程
[NSThread isMainThread]
#pragma mark -- NSObject開辟子線程
//NSObject開辟子線程 //第一個參數 : selector,子線程執行的代碼 //第二個參數 : 表示selector傳遞的參數
[self performSelectorInBackground:@selector(sayHi) withObject:@"aaa"];
#pragma mark -- NSThread手動開辟子線程
//使用NSThread開辟子線程 //第一個參數:target //第二個參數:action //第三個參數:傳參
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(sayHi) object:nil];
//讓線程開始執行 [thread start]; //取消線程 不會真正取消線程,而是標記這個被取消啦
[thread cancel];
#pragma mark -- NSThread 自動開辟線程
//使用NSThread自動開辟線程 //不需要手動開啟線程
[NSThread detachNewThreadSelector:@selector(sayHi) toTarget:self withObject:nil];
//關閉線程
//寫在哪里哪個線程就關閉啦,注意:不要隨意使用,使用時一定要注意當前線程是否是主線程
[NSThread exit];
//NSObject中回到主線程去做某事
//第一個參數:回到主線程做的事情
//第二個參數:傳遞的參數
//第三個參數:直到當前線程已經結束才做
[self performSelectorOnMainThread:@selector(onMainThread) withObject:nil waitUntilDone:YES];
pragma mark -- NSOperation
//NSOperation是一個抽象類,不能直接使用 //通過NSInvocationOperation類來創建一個以NSOperation對象 //NSOperation類及其子類本身不會進行線程創建 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(hehehe) object:nil]; //operation在單獨使用時一定要調用這個方法
[operation start];
NSBlockOperation *blockoperation = [NSBlockOperation blockOperationWithBlock:^{
}];
//blockoperation在單獨使用時一定要調用這個方法
[blockoperation start];
//NSOperationQueue隊列
//NSOperationQueue是一個隊列管理器,可以根據operation任務自己分配線程,自己管理線程的生命周期 //在開發過程中我們不需要管理線程的創建和銷毀
//NSOperationQueue創建的是n個并行的線程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//將operation 和blockoperation添加到queue隊列中
[queue addOperation:operation];
[queue addOperation:blockoperation];
//給兩個任務添加一個依賴關系,這兩個任務就會按照依賴關系順序執行 [operation addDependency:blockoperation];
//獲取系統獲取的隊列
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
//最大線程并發數 //maxConcurrentOperationCount表示同時執行任務的最大數量 //即使只執行一個任務,系統有時候也會開辟多個線程去執行這個任務
queue.maxConcurrentOperationCount = 2;
pragma mark -- GCD串行隊列
//系統提供的一個串行隊列 //使用系統提供的串行隊列(主隊列)
dispatch_queue_t queue = dispatch_get_main_queue();
//自己創建一個串行隊列 //第一個參數:系統提供好的一個宏 //第二個參數:系統保留字段 0
dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0);
pragma mark -- 創建一個并行的隊列
//使用系統提供的并行隊列 //DISPATCH_QUEUE_PRIORITY_BACKGROUND表示隊列的優先級 //0 系統保留字段
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
//自己創建一個并行隊列 //第一個參數:表示隊列的名字 //第二個參數:系統提供好的一個宏
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
//使用dispatch_async向隊列中添加任務
//任務會排隊執行
dispatch_async(queue, ^{
});
pragma mark -- 表示幾秒后做該事
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"已經3秒后啦");
});
pragma mark -- 重復向一個隊列中添加一系列任務
//向queue隊列中添加100個任務
dispatch_apply(100, queue, ^(size_t index) { NSLog(@"index == %zu", index);
});
pragma mark -- 分組
//創建一個分組
dispatch_group_t group = dispatch_group_create();
//向分組中添加一個任務
dispatch_group_async(group, queue, ^{ NSLog(@"我是第1個任務");
});
//向分組中添加結束任務(最后執行)
//不要將結束任務放在第一個位置 dispatch_group_notify(group, queue, ^{ NSLog(@"無論如何 我是最后一個");
});
pragma mark -- 并發中的串行
//在它之前的任務可以并發執行,在它之后的任務也會去并發之后
dispatch_barrier_async(queue, ^{ NSLog(@"我是插入操作");
});
pragma mark —- GCD其他添加功能
dispatch_once_t onceToken;
//任務添加到隊列中,但任務在程序運行過程中,只執行一次
dispatch_once(&onceToken, ^{
});
//任務添加到隊列中,block不執行完,下面的代碼不會執行
//async和sync的區別:
async不等block執行完就去執行下面的代碼;sync會等block執行完后才去執行block體外面的代碼
dispatch_sync(queue, ^{
});
//任務添加到隊列中,任務是函數,而非block
//第一個參數:隊列
//第二個參數:函數參數內容
//第三個參數:函數
dispatch_async_f(queue, @"passValue", function);