您的位置:首页 > 移动开发 > IOS开发

iOS 多线程的使用(GCD)

2015-10-02 16:11 381 查看
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];

死锁
在主队列里面 在主线程执行同步任务

同步执行
一个任务执行完毕之后 再去执行另外一个任务

主队列(GCD)同步执行某个任务的时候
会等待前面的任务 执行完毕之后
再去执行主队列里面的任务

主队列是在主线程里面同步执行任务的
它们在同一个线程里面 线程是顺序执行的这时候主线程会等主队列里面的任务执行完毕
再去执行主线程 主线程执行完毕才回去执行主队列里面的任务
从而出现死锁

通过GCD获得主队列dispatch_get_main_queue
所有接收队列对象
都用dispatch_queue_t
dispatch_queue_t mainQueue = dispatch_get_main_queue();

同步执行任务
dispatch_sync(mainQueue, ^{
NSLog(@"000000");
});

异步执行

异步
允许开辟一个线程(利用系统空闲时间去执行 程序员
不能控制)

同步不可以开辟线程
(同步顺序执行)

dispatch_async(mainQueue, ^{
NSLog(@"%@ %d",[NSThread currentThread],i);
});

dispatch_get_main_queue()属于串行队列
dispatch_queue_create("", null)属于串行队列

串行队列按照顺序去执行队列的任务
/**
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"11111");
});
dispatch_async(mainQueue, ^{
NSLog(@"22222");
});
dispatch_async(mainQueue, ^{
NSLog(@"3333333");
});
dispatch_async(mainQueue, ^{
NSLog(@"44444444");
});
*/
/**

自己创建队列的方式
dispatch_queue_t huluwaqueue = dispatch_queue_create("huluwa", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 5; i ++) {

dispatch_async(huluwaqueue, ^{
// NSLog(@"11111");
NSLog(@"%@ %d",[NSThread currentThread],i);
});
}

*/
/**
//#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //

//#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //
默认(中)
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2) //

//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //
后台

// gcd 默认提供了全局的并发队列
供整个应用程序使用 不需要手动创建
dispatch_queue_t quanjuQueue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t quanjuQueue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t quanjuQueue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(quanjuQueue1, ^{
NSLog(@"11111");
NSLog(@"11%@",[NSThread currentThread]);
});
dispatch_async(quanjuQueue2, ^{
NSLog(@"2222");
NSLog(@"22%@",[NSThread currentThread]);
});
dispatch_async(quanjuQueue3, ^{
NSLog(@"33333");
NSLog(@"33%@",[NSThread currentThread]);
});
*/

/**
//
创建分组dispatch_group_create()
// dispatch_group_t
相当于
类名
dispatch_group_t num1 = dispatch_group_create();
dispatch_queue_t queue1 = dispatch_queue_create("num1",NULL);
for (int i = 0; i < 5; i ++) {
dispatch_group_async(num1, queue1, ^{
NSLog(@"download2");
});
}

// 分组执行完毕
调用这个方法
dispatch_group_notify(num1, queue1, ^{
NSLog(@"执行完毕的代码1");
});

dispatch_group_t num2 = dispatch_group_create();
dispatch_queue_t queue2 = dispatch_queue_create("num1",NULL);

for (int i = 0; i < 3; i ++) {
dispatch_group_async(num2, queue2, ^{
NSLog(@"download3");
});
}

// 分组执行完毕
调用这个方法
dispatch_group_notify(num2, queue2, ^{
NSLog(@"执行完毕的代码2");
});

*/
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: