一:在学习多线程之前首先区分几个容易混淆的概念
二:GCD的基本用法
//
// ViewController.m
// GCD
//
// Created by fe on 16/9/30.
// Copyright © 2016年 fe. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self syncFIFOQueue];
}
//异步函数+并发队列 总结:会开辟线程,任务并发执行
- (void)asyncGlobalQueue
{
/*第一种创建并发队列方法
*第一个参数:C语言的字符串,用来表示队列名
*第二个参数:队列属性 DISPATCH_QUEUE_SERIAL(串行队列)
* DISPATCH_QUEUE_CONCURRENT(并发队列)
*/
dispatch_queue_t queue = dispatch_queue_create("异步函数+并发队列", DISPATCH_QUEUE_CONCURRENT);
/*
*第二种创建并发队列的方法
*第一个参数:队列优先级,
*第二个参数:预留参数,永远填0
*/
//dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/*创建异步函数
*第一个参数:队列
*第二个参数:block,在里面封装任务
*/
dispatch_async(queue, ^{
NSLog(@"----Task1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----Task2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----Task3----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----Task4----%@",[NSThread currentThread]);
});
}
//异步函数+串行队列 总结:会开辟线程,任务FIFO执行
- (void)asyncFIFOQueue
{
/*
*第一个参数:C语言的字符串,用来表示队列名
*第二个参数:队列属性 DISPATCH_QUEUE_SERIAL(串行队列)
* DISPATCH_QUEUE_CONCURRENT(并发队列)
*/
dispatch_queue_t queue = dispatch_queue_create("异步函数+串行队列", DISPATCH_QUEUE_SERIAL);
/*创建异步函数
*第一个参数:队列
*第二个参数:block,在里面封装任务
*/
dispatch_async(queue, ^{
NSLog(@"----Task1----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----Task2----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----Task3----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----Task4----%@",[NSThread currentThread]);
});
}
//同步函数+并发队列 总结:不会开辟新线程,任务FIFO执行
- (void)syncGlobalQueue
{
/*
*第一个参数:C语言的字符串,用来表示队列名
*第二个参数:队列属性 DISPATCH_QUEUE_SERIAL(串行队列)
* DISPATCH_QUEUE_CONCURRENT(并发队列)
*/
dispatch_queue_t queue = dispatch_queue_create("同步函数+并发队列", DISPATCH_QUEUE_CONCURRENT);
/*创建同步函数
*第一个参数:队列
*第二个参数:block,在里面封装任务
*/
dispatch_sync(queue, ^{
NSLog(@"----Task1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----Task2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----Task3----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----Task4----%@",[NSThread currentThread]);
});
}
//同步函数+串行队列 总结:不会开辟新线程,任务FIFO执行
- (void)syncFIFOQueue
{
/*
*第一个参数:C语言的字符串,用来表示队列名
*第二个参数:队列属性 DISPATCH_QUEUE_SERIAL(串行队列)
* DISPATCH_QUEUE_CONCURRENT(并发队列)
*/
dispatch_queue_t queue = dispatch_queue_create("同步函数+串行队列", DISPATCH_QUEUE_SERIAL);
/*创建同步函数
*第一个参数:队列
*第二个参数:block,在里面封装任务
*/
dispatch_sync(queue, ^{
NSLog(@"----Task1----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----Task2----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----Task3----%@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"----Task4----%@",[NSThread currentThread]);
});
}
@end