您的位置:首页 > 其它

关于GCD的一些总结

2015-12-16 23:37 351 查看
/**

1.GCD的队列:

串行队列:让任务一个接着一个地执行(一个任务执行完毕之后,再执行下一个任务)

并行队列:可以让多个任务同时执行(GCD开启多个线程同时执行任务)

可以同时调度多个任务执行

并发功能只有在异步(dispatch_async)函数下在有效

主队列:

主队列中的任务,只有在主线程空闲的时候才会被调度执行。如果主线程上又代码执行,主队列不会调度任务

2.GCD中2个用来执行任务的函数

同步的方式执行任务:

在当前线程中依次的执行任务

异步的方式执行任务:

开辟新开线程,在新线程中执行任务

如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度线程执行异步任务

如果没有,就会创建新的线程去执行任务。

*/

#import
"ViewController.h"

@interfaceViewController ()

@end

@implementation ViewController

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

[selfdemo07];

}

//同步任务+串行队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。

//队列中的任务有序执行:

-(void) demo01{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:01:53.897
关于GCD的一些总结[2437:73550] start1

2015-12-14 12:01:55.903
关于GCD的一些总结[2437:73550] end1

2015-12-14 12:01:55.903
关于GCD的一些总结[2437:73550] aaaaa

2015-12-14 12:01:55.903
关于GCD的一些总结[2437:73550] start2

2015-12-14 12:01:56.907
关于GCD的一些总结[2437:73550] end2

2015-12-14 12:01:56.907
关于GCD的一些总结[2437:73550] bbbb

2015-12-14 12:01:56.907
关于GCD的一些总结[2437:73550] start3

2015-12-14 12:01:57.412
关于GCD的一些总结[2437:73550] end3

*/

//异步任务+串行队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//队列中的任务有序执行:当前线程将任务添加到了串行队列,当子线程去执行任务的时候,也只能一个一个的取出来执行

-(void) demo02{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

dispatch_async(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_async(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_async(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:02:29.504
关于GCD的一些总结[2452:74099] start1

2015-12-14 12:02:29.504
关于GCD的一些总结[2452:74064] aaaaa

2015-12-14 12:02:29.505
关于GCD的一些总结[2452:74064] bbbb

2015-12-14 12:02:31.507
关于GCD的一些总结[2452:74099] end1

2015-12-14 12:02:31.507
关于GCD的一些总结[2452:74099] start2

2015-12-14 12:02:32.513
关于GCD的一些总结[2452:74099] end2

2015-12-14 12:02:32.513
关于GCD的一些总结[2452:74099] start3

2015-12-14 12:02:33.018
关于GCD的一些总结[2452:74099] end3

*/

//同步任务+并发队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。

//队列中的任务有序执行:

-(void) demo03{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

dispatch_sync(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:04:33.057
关于GCD的一些总结[2476:75282] start1

2015-12-14 12:04:35.062
关于GCD的一些总结[2476:75282] end1

2015-12-14 12:04:35.063
关于GCD的一些总结[2476:75282] aaaaa

2015-12-14 12:04:35.063
关于GCD的一些总结[2476:75282] start2

2015-12-14 12:04:36.068
关于GCD的一些总结[2476:75282] end2

2015-12-14 12:04:36.068
关于GCD的一些总结[2476:75282] bbbb

2015-12-14 12:04:36.069
关于GCD的一些总结[2476:75282] start3

2015-12-14 12:04:36.573
关于GCD的一些总结[2476:75282] end3

*/

//异步任务+并发队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//无序:当前线程添加任务,因为是并发队列,系统会调度多个子线程去执行任务

-(void) demo04{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_async(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_async(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75869] aaaaa

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75901] start1

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75869] bbbb

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75902] start2

2015-12-14 12:05:23.010
关于GCD的一些总结[2492:75900] start3

2015-12-14 12:05:23.515
关于GCD的一些总结[2492:75900] end3

2015-12-14 12:05:24.015
关于GCD的一些总结[2492:75902] end2

2015-12-14 12:05:25.013
关于GCD的一些总结[2492:75901] end1

*/

//同步任务+主队列=死锁

//总结:当将任务添加到主队列后,主线程等待任务被执行完毕。

//在主队列中的任务等待主线程空闲的时候被调度。它们之间的相互等待造成了死锁

-(void) demo05{

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

//异步任务+主队列

//总结:主线程添加完第一个任务之后,会立刻添加后面的任务,

//在主队列中的任务在等待着主线程空闲,主线程空闲之后就去执行主队列中的任务

-(void) demo06{

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:06:12.769
关于GCD的一些总结[2508:76537] aaaaa

2015-12-14 12:06:12.770
关于GCD的一些总结[2508:76537] bbbb

2015-12-14 12:06:12.770
关于GCD的一些总结[2508:76537] start1

2015-12-14 12:06:14.771
关于GCD的一些总结[2508:76537] end1

2015-12-14 12:06:14.772
关于GCD的一些总结[2508:76537] start2

2015-12-14 12:06:15.773
关于GCD的一些总结[2508:76537] end2

2015-12-14 12:06:15.773
关于GCD的一些总结[2508:76537] start3

2015-12-14 12:06:16.274
关于GCD的一些总结[2508:76537] end3

*/

//死锁的解决方案:将同步任务+主队列放在子线程中

//总结:现在子线程负责添加任务,主线程空闲着,可以去执行主队列中的任务

-(void) demo07{

dispatch_async(dispatch_get_global_queue(0,0), ^{

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

});

}

/*

2015-12-14 12:06:42.841
关于GCD的一些总结[2521:77234] start1

2015-12-14 12:06:44.843
关于GCD的一些总结[2521:77234] end1

2015-12-14 12:06:44.843
关于GCD的一些总结[2521:77266] aaaaa

2015-12-14 12:06:44.844
关于GCD的一些总结[2521:77234] start2

2015-12-14 12:06:45.845
关于GCD的一些总结[2521:77234] end2

2015-12-14 12:06:45.845
关于GCD的一些总结[2521:77266] bbbb

2015-12-14 12:06:45.846
关于GCD的一些总结[2521:77234] start3

2015-12-14 12:06:46.347
关于GCD的一些总结[2521:77234] end3

*/

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

/**

1.GCD的队列:

串行队列:让任务一个接着一个地执行(一个任务执行完毕之后,再执行下一个任务)

并行队列:可以让多个任务同时执行(GCD开启多个线程同时执行任务)

可以同时调度多个任务执行

并发功能只有在异步(dispatch_async)函数下在有效

主队列:

主队列中的任务,只有在主线程空闲的时候才会被调度执行。如果主线程上又代码执行,主队列不会调度任务

2.GCD中2个用来执行任务的函数

同步的方式执行任务:

在当前线程中依次的执行任务

异步的方式执行任务:

开辟新开线程,在新线程中执行任务

如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度线程执行异步任务

如果没有,就会创建新的线程去执行任务。

*/

#import
"ViewController.h"

@interfaceViewController ()

@end

@implementation ViewController

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

[selfdemo07];

}

//同步任务+串行队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。

//队列中的任务有序执行:

-(void) demo01{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:01:53.897
关于GCD的一些总结[2437:73550] start1

2015-12-14 12:01:55.903
关于GCD的一些总结[2437:73550] end1

2015-12-14 12:01:55.903
关于GCD的一些总结[2437:73550] aaaaa

2015-12-14 12:01:55.903
关于GCD的一些总结[2437:73550] start2

2015-12-14 12:01:56.907
关于GCD的一些总结[2437:73550] end2

2015-12-14 12:01:56.907
关于GCD的一些总结[2437:73550] bbbb

2015-12-14 12:01:56.907
关于GCD的一些总结[2437:73550] start3

2015-12-14 12:01:57.412
关于GCD的一些总结[2437:73550] end3

*/

//异步任务+串行队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//队列中的任务有序执行:当前线程将任务添加到了串行队列,当子线程去执行任务的时候,也只能一个一个的取出来执行

-(void) demo02{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

dispatch_async(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_async(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_async(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:02:29.504
关于GCD的一些总结[2452:74099] start1

2015-12-14 12:02:29.504
关于GCD的一些总结[2452:74064] aaaaa

2015-12-14 12:02:29.505
关于GCD的一些总结[2452:74064] bbbb

2015-12-14 12:02:31.507
关于GCD的一些总结[2452:74099] end1

2015-12-14 12:02:31.507
关于GCD的一些总结[2452:74099] start2

2015-12-14 12:02:32.513
关于GCD的一些总结[2452:74099] end2

2015-12-14 12:02:32.513
关于GCD的一些总结[2452:74099] start3

2015-12-14 12:02:33.018
关于GCD的一些总结[2452:74099] end3

*/

//同步任务+并发队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa。

//队列中的任务有序执行:

-(void) demo03{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

dispatch_sync(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:04:33.057
关于GCD的一些总结[2476:75282] start1

2015-12-14 12:04:35.062
关于GCD的一些总结[2476:75282] end1

2015-12-14 12:04:35.063
关于GCD的一些总结[2476:75282] aaaaa

2015-12-14 12:04:35.063
关于GCD的一些总结[2476:75282] start2

2015-12-14 12:04:36.068
关于GCD的一些总结[2476:75282] end2

2015-12-14 12:04:36.068
关于GCD的一些总结[2476:75282] bbbb

2015-12-14 12:04:36.069
关于GCD的一些总结[2476:75282] start3

2015-12-14 12:04:36.573
关于GCD的一些总结[2476:75282] end3

*/

//异步任务+并发队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//无序:当前线程添加任务,因为是并发队列,系统会调度多个子线程去执行任务

-(void) demo04{

dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_async(queue, ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_async(queue, ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75869] aaaaa

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75901] start1

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75869] bbbb

2015-12-14 12:05:23.009
关于GCD的一些总结[2492:75902] start2

2015-12-14 12:05:23.010
关于GCD的一些总结[2492:75900] start3

2015-12-14 12:05:23.515
关于GCD的一些总结[2492:75900] end3

2015-12-14 12:05:24.015
关于GCD的一些总结[2492:75902] end2

2015-12-14 12:05:25.013
关于GCD的一些总结[2492:75901] end1

*/

//同步任务+主队列=死锁

//总结:当将任务添加到主队列后,主线程等待任务被执行完毕。

//在主队列中的任务等待主线程空闲的时候被调度。它们之间的相互等待造成了死锁

-(void) demo05{

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

//异步任务+主队列

//总结:主线程添加完第一个任务之后,会立刻添加后面的任务,

//在主队列中的任务在等待着主线程空闲,主线程空闲之后就去执行主队列中的任务

-(void) demo06{

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

}

/*

运行结果:

2015-12-14 12:06:12.769
关于GCD的一些总结[2508:76537] aaaaa

2015-12-14 12:06:12.770
关于GCD的一些总结[2508:76537] bbbb

2015-12-14 12:06:12.770
关于GCD的一些总结[2508:76537] start1

2015-12-14 12:06:14.771
关于GCD的一些总结[2508:76537] end1

2015-12-14 12:06:14.772
关于GCD的一些总结[2508:76537] start2

2015-12-14 12:06:15.773
关于GCD的一些总结[2508:76537] end2

2015-12-14 12:06:15.773
关于GCD的一些总结[2508:76537] start3

2015-12-14 12:06:16.274
关于GCD的一些总结[2508:76537] end3

*/

//死锁的解决方案:将同步任务+主队列放在子线程中

//总结:现在子线程负责添加任务,主线程空闲着,可以去执行主队列中的任务

-(void) demo07{

dispatch_async(dispatch_get_global_queue(0,0), ^{

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start1");

[NSThreadsleepForTimeInterval:2.0f];

NSLog(@"end1");

});

NSLog(@"aaaaa");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start2");

[NSThreadsleepForTimeInterval:1.0f];

NSLog(@"end2");

});

NSLog(@"bbbb");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"start3");

[NSThreadsleepForTimeInterval:0.5f];

NSLog(@"end3");

});

});

}

/*

2015-12-14 12:06:42.841
关于GCD的一些总结[2521:77234] start1

2015-12-14 12:06:44.843
关于GCD的一些总结[2521:77234] end1

2015-12-14 12:06:44.843
关于GCD的一些总结[2521:77266] aaaaa

2015-12-14 12:06:44.844
关于GCD的一些总结[2521:77234] start2

2015-12-14 12:06:45.845
关于GCD的一些总结[2521:77234] end2

2015-12-14 12:06:45.845
关于GCD的一些总结[2521:77266] bbbb

2015-12-14 12:06:45.846
关于GCD的一些总结[2521:77234] start3

2015-12-14 12:06:46.347
关于GCD的一些总结[2521:77234] end3

*/

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

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