区分线程, 进程!
进程: 一个正在运行的程序
线程: 程序中独立运行的代码段
一个进程是由一个或多个线程组成的, 线程负责执行代码, 进程负责调度分配.
线程分为单线程, 多线程.
在以下三种情况下使用多线程:
1. 进行大量的运算的时候
2. 数据读取 (本地读取/数据库查询所有数据的时候)
3. 网络请求 (同步网络请求)
线程与线程之间是独立运行, 互不干扰的
多线程中不能对UI进行修改, 只能在主线程中修改
多线程方法中需要加自动释放池
多线程实现的种类: NSThread, NSObject, NSOperation(NSOperationQueue), NSBlockOperation, NSInvocationOperation, GCD多线程
1. NSThread是一种轻量级的多线程
初始化方法有两种:
- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
2. NSObject是最简单的后台
- (void)performSelectorInBackground:@selector(SEL)selector withObject:(id)arg;
3. NSOperation和NSOperationQueue
NSOperationQueue线程队列,会自动调用start方法
@property NSInteger maxConcurrentOperationCount;
设置线程的数量, 让各路线程排队执行, 当数量为1的时候, 我们称线程与线程之间是同步的- (void)addOperation:(NSOperation *)op;
4. NSBlockOperation
+ (instancetype)blockOperationWithBlock:(void (^)(void))block;
block中的内容就是多线程所要执行的代码5. NSInvocationOperation
- (instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;
6. GCD多线程(最常用的)dispatch queue分为2种:
serailQueue: 实现线程同步, 一次执行一个任务
concurrent:并发执行多个任务, 遵循FIFO
(1) 创建一个同步线程队列(括号第一个参数是给线程起的名字, 第二个参数是表明线程是同步的
eg:dispatch_queue_t queue = dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);
(2) 异步执行同步线程队列
dispatch_async(queue, ^{
});
想显示到界面上,所有的跟UI有关的内容全部要在主线程运行, 所以用下面的代码返回主线程, 这里面的代码都是在主线程中运行
dispatch_async(dispatch_get_main_queue(), ^{
});