所有应用程序都是一个进程,打开应用程序就进入一个进程,给进程分配内存空间,进程里可以分配很多线程,一个进程里面最少有一个线程.线程与线程之间是互不干扰的, 当只有一个主线程时为单线程.
经常用多线程的地方:1.大量运算for循环; 2.数据读取(本地, 数据库查询所有数据的时候); 3. 进行网络请求的时候(同步网络请求).
常见的多线程方式
1.NSThread
初始化方法 :
(1). NSThread *thread = [NSThread alloc] initWithTarget: self selector:@selector (buttonAction) object:nil];
[thread start];
[thread release];
(2). [NSThread detachNewThreadSelector: @selector(buttonAction) toTarget:self withObject: nil];
2. NSObject
初始化方法:
[self performSelectorInBackground: @selector(buttonAction) withObject:nil];
3. NSOperation 和 NSOperationQueue(线程队列)(同时运行的多线程建议10个以内)
一般不直接使用NSOperation而是建一个类(例如 MyOperation)继承于NSOperation
在MyOperation中需要重写main函数,并添加自动释放池.
MyOperation *my = [[MyOperation alloc] init];
[my start]; 加载queue中会自动调用start;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1; // 设置最大并发数;
最大并发数为 1 的时候我们称 线程与线程之间是同步的 ( 多条有并发 );[queue addOperation:my];
MyOperation *my2 = [[MyOperation alloc] init];
[queue addOperation:my2]; 线程的并发;没有顺序;
[queue release];
4.NSBLockOperation
初始化方法:
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
@autoreleasepool {
// 在次添加方法;
// 所有跑多线程的地方都要加自动释放池
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:block];
[queue release];
5.NSInvocationOperation
使用方法:
NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(button1Action) object:nil];
[invocation start];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:invocation];
[queue release];
(object为往形参上传值的)
6.GCD多线程
GCD多线程为c语言,不能写自动释放池;
第一步:创建一个同步线程队列
dispatch_queue_t queue = dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);
第二部:异步执行同步线程队列 (将block里面的内容放到queue中异步执行)
dispatch_async(queue, ^{
// 多线程代码;
// 显示到界面上,所有跟UI相关的内容全部都要在主线程中运行;
// 返回主线程
dispatch_async(dispatch_get_main_queue(), ^{
// 在主线程中运行的代码;
});
});
7.//默认并行队列;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 程序在此默认为同步;
dispatch_async(dispatch_get_main_queue(), ^{
// 返回主线程;
// 在主线程中运行的代码
});
});
早期的NSObject,NSThread,NSOperation 返回主线程方式;
[self performSelectorOnMainThread:@selector(creatImage:) withObject:@"iiii" waitUntilDone:YES];