标签:
iOS多线程几种实现方案
1.pthread . C语言但是使用难度大,用于Windows,Linux等平台,几乎不用
2.NSThread OC 简单易用,直接操作线程对象,但是偶尔使用。
3.GCD C语言 是为了替代NSThread等线程计数,充分利用设备多核,自动管理所以经常使用。
4.NSOperation OC语言,基于GCD 自动管理,所以也是经常使用。
1.在pthread中要实现它的子线程,导入<pthread.h>,pthread_t thread;pthread_create($thread,NULL,函数名,NULL);实现函数方法,比如void * run(void *param){for 循环一下,return NULL;}
2.NSThread
首先是创建线程
- (void)viewDidLoad { [super viewDidLoad]; NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil]; [thread start]; } -(void)run:(NSString *)param{ for (int i=0; i<10000; i++) { NSLog(@"%@--%@",param,[NSThread currentThread].name); } }
启动线程
还有一种创建线程的方式
[self performSelectorInBackground:(nonnull SEL) withObject:(nullable id)] [self performSelectorOnMainThread:(nonnull SEL) withObject:(nullable id) waitUntilDone:(BOOL)]
以上都不是很完美的方式
/*******************************************************/
3.GCD
全称:Grand Central Dispatch 牛逼的中枢调度器
为多核并行解决方案,自动利用CPU内核。自动管理生命周期,不需要编写任何线程管理代码
两个核心概念:任务和队列
两个步骤:定制任务和添加任务
//异步 具备开启新线程的能力 dispatch_async(dispatch_queue_t queue, ^{ code }) //同步 dispatch_sync(dispatch_queue_t queue, ^{ code })
queue 队列 block 任务
GCD队列的两大类型
并发队列 只有在异步才有效,多个任务并发执行
串行队列 一个任务完成后,才开始执行下一个任务
创建并发队列
dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
多线程安全隐患
1.多个线程可能会访问同一块资源。比如多个线程访问同一个对象,同一个变量和文件。想象存钱和取钱的例子。会覆盖之前的数据,无法实时更新提示。
2.解决方案就是加一把锁。互斥锁。等一个线程访问完毕后就解除锁。@synchronized(锁对象self)但是它会消耗大量CPU资源。不建议使用
原子核非原子属性
nonatomic
非线程安全,适合内存小的移动设备,所以所有的属性声明都是nonatomic
尽量避免多线程抢夺同一资源
atomic
原子属性 为setter方法,需要消耗大量资源
线程之间的通信
一个进程中,线程不是孤立 的,多个线程之间需要通信,比如在主线程中我们添加UI控件,图片等,在子线程中下载图片,下载完毕之后,要在主线程中显示图片
标签:
原文地址:http://www.cnblogs.com/MrXiaoWan/p/5754618.html