1.进程的基本概念
(1)每一个进程都有一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况
(2)同一个进程中的线程共享内存中的内存和资源
2.多线程的基本概念
(1)每一个程序都有一个主线程,程序启动时创建
(2)主线程的生命周期是和应用程序绑定的,程序结束时,主线程也就停止了
(3)多线程技术表示,一个应用程序有多个线程,使用多线程能提高CPU的使用率,防止主线程阻塞
(4)任何有可能阻塞主线程的任务不要再主线程执行(如访问网络和数据库)
3.
isMainThread
方法返回执行的代码是否在主线程中执行
BOOL
bool1 = [[
NSThread
currentThread
]
isMainThread
];
NSLog(@"bool1 is %d", bool1);
4.
(1)第一种方式创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
//
手动开启线程
[thread start];
(2)第二种方式创建线程
[
NSThread
detachNewThreadSelector
:
@selector
(run)
toTarget
:
self
withObject
:
nil
];
(3)第三种方式创建线程
(3)第三种方式创建线程
[self performSelectorInBackground:@selector(run) withObject:nil];
(4)第四种方式:block语法启动一个线程
//NSOperationQueue是一个操作队列或者线程池
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//往队列中添加一个操作
[queue
addOperationWithBlock
:^{
[
self
run
];
}];
(5)第五种方式:NSOperation开启一个线程
//不要去直接创建NSOperation对象
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
[queue
addOperation
:operation];
(6)
第六种方式:创建一个继承于NSOperation的类开启一个线程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
PersonOperation *operation = [[PersonOperation alloc] init];
[queue
addOperation
:operation];
5.
设置并发数
queue.maxConcurrentOperationCount = 1;
6.
设置等级
operation.
queuePriority
=
NSOperationQueuePriorityVeryLow
;
7.
在异步线程中,最好添加上自动释放池
@autoreleasepool {}
8.在多线程中使用定时器必须开启
RunLoop,因为只有开启
RunLoop保持线程为活动状态,才能保持定时器能不断执行
9.
(1)创建定时器方法一
//
此方法默认已经将定时器添加到当前的
runloop
中去了
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
[[
NSRunLoop
currentRunLoop
]
run
];
(2)创建定时器方法二
//
此方法是创建一个定时器,但是并没有把它添加到
runloop
中去
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
//
往
runloop
中添加定时器
[[
NSRunLoop
currentRunLoop
]
addTimer
:timer
forMode
:
NSDefaultRunLoopMode
];
[[NSRunLoop currentRunLoop] run];
10.
所有有关
UI
的操作必须放在主线程中执行
11.线程的生命周期存在五个状态:新建、就绪、运行、阻塞、死亡
12.GCD是一个替代诸如NSThread,NSOperationQueue,NSInvocationOperation等技术的一个高效、强大、底层的技术
13.GCD支持同步或异步任务处理,串行或并行的处理队列,非系统调用的信号量机制,定时任务处理,进程、文件或网络的监听任务等
14.GCD优点:
(1)易用:GCD比之thread更简单易用。基于block的特性导致它能极为简单地在不同代码作用域之间传递上下文
(2)效率:GCD实现功能轻量、优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速
(3)性能:GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率
(4)安全:无需加锁或其他同步机制
15.Dispatch Queue是执行处理的等待队列。通过d
ispatch_async等函数,按照先进先出(FIFO)顺序追加到
Queue中处理
16.两种
Dispatch Queue:
(1)Serial
Dispatch Queue (Private
Dispatch Queue
)—— 等待现在正在执行的任务处理结束
- 一个线程同时执行一个任务,可以避免数据竞争的问题
- 可以生成多个Serial Dispatch Queue,各个Serial Dispatch Queue将并行执行
(2)Concurrent
Dispatch Queue (Global
Dispatch Queue
) —— 不等待现在正在执行的任务处理结束(并行、并发)
- 多个线程同时执行多个任务,效率高。具体是多少个线程并发执行,取决于CPU核数和CPU负荷
17.
获取系统的主线程队列
dispatch_queue_t
queue =
dispatch_get_main_queue
();
18.Main
Dispatch Queue是在主线程里执行的队列,即为
Serial
Dispatch Queue
19.
获取系统默认创建的异步线程队列
dispatch_queue_t
globleQueue =
dispatch_get_global_queue
(
DISPATCH_QUEUE_PRIORITY_DEFAULT
,
0
);
20.
Global
Dispatch Queue
是所有应用程序都能够使用的
Concurrent
Dispatch Queue
21.
Global
Dispatch Queue的4个执行优先级
- DISPATCH_QUEUE_PRIORITY_HIGH
- DISPATCH_QUEUE_PRIORITY_DEFAULT
- DISPATCH_QUEUE_PRIORITY_LOW
- DISPATCH_QUEUE_PRIORITY_BACKGROUND(非常低的优先级,这个优先级只用于不太关心完成时间的真正的后台任务)
22.dispatch_async是指将指定的Block块异步的追加到指定的
Dispatch Queue中,
dispatch_async函数不做任何等待
23.
dispatch_sync同步追加Block块,在追加Block结束之前,
dispatch_sync函数会一直等待,等待队列前面的所有任务完成后才能执行追加的任务
24.使用
dispatch_sync容易引起死锁
25.dispatch_once一次执行。保证
dispatch_once中的代码块在应用程序里面只执行一次,无论是不是多线程。所以可以用来实现单例模式,安全、简洁、方便
26.
使用
GCD
创建单例
+ (
Person
*)sharePerson
{
static dispatch_once_t onceToken;
dispatch_once (&onceToken, ^{
ps = [[ Person alloc ] init ];
});
return ps ;
{
static dispatch_once_t onceToken;
dispatch_once (&onceToken, ^{
ps = [[ Person alloc ] init ];
});
return ps ;
}
27.dispatch_after实现延迟调用
- 原理:并不是在指定时间后执行任务处理,而是在指定时间后把任务追加到Dispatch Queue里面,所以会有少许延迟
- 注意我们不能(直接)取消已经提交到dispatch_after里的代码
28.
dispatch_time_t->when
什么时候执行延迟调用的代码
dispatch_queue_t -> queue
执行的任务放入到哪个队列
dispatch_block_t -> block 具体执行的任务
29.
异步添加事件
,
所有任务的执行顺序是随机的
30.dispatch_group_async用来监视一组block对象的完成,可以同步或异步地监视
- dispatch_group_notify所有任务执行结束汇总,不阻塞当前进程
- dispatch_group_wait等待直到所有任务执行结束,中途不能取消,阻塞当前进程
31.
dispatch_apply(size_t iterations, dispatch_queue_t queue, <#^(size_t)block#>)
其中:iterations:
遍历执行的次数;
queue:
执行操作所在的队列;
block: 执行的具体任务
32.
使用
dispatch_apply
执行效率比一般的
for
循环执行效率要高
33.Dispatch Semaphore(信号)
- Dispatch Semaphore是持有计数的信号
- Dispatch Semaphore使用计数来实现该信号功能
- 等待条件: 如果信号量>0,则不需要等待直接往下执行,但信号量-1, 如果信号量为0则等待
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
- 发信号,使原来的信号量计数值+1
dispatch_semaphore_signal(semaphore);