码迷,mamicode.com
首页 > 编程语言 > 详细

多线程

时间:2016-05-29 15:05:24      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

1.创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空 间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K 的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间 。

2.主线程的使用注意

● 别将比较耗时的操作放到主线程中
● 耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验 

3.pthread

技术分享

4.NSThread

三种方式创建:

一.

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start];

这里的thread是局部变量。。不会在}的时候立刻销毁。。而是在子线程程序运行完成的时候自动销毁;

二.

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 

三.

[self performSelectorInBackground:@selector(run:) withObject:nil];

主线程相关用法:
+ (NSThread *)mainThread; // 获得主线程

- (BOOL)isMainThread; // 是否为主线程
+ (BOOL)isMainThread; // 是否为主线程 

5.安全隐患解决 – 互斥锁 

● 互斥锁使用格式
@synchronized(锁对象) { // 需要锁定的代码 } 注意:锁定1份代码只用1把锁,用多把锁是无效的

● 互斥锁的优缺点
● 优点:能有效防止因多线程抢夺资源造成的数据安全问题

● 缺点:需要消耗大量的CPU资源

● 互斥锁的使用前提:多条线程抢夺同一块资源

● 相关专业术语:线程同步
● 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)

● 互斥锁,就是使用了线程同步技术 

6.原子和非原子属性

● OC在定义属性时有nonatomic和atomic两种选择
● atomic:原子属性,为setter方法加锁(默认就是atomic)

● nonatomic:非原子属性,不会为setter方法加锁 

7.线程间通信 

● 线程间通信常用方法
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

8.计算哪个步骤耗时多少

    CFTimeInterval begin = CFAbsoluteTimeGetCurrent();

    // 根据图片的网络路径去下载图片数据

    NSData *data = [NSData dataWithContentsOfURL:url];

    CFTimeInterval end = CFAbsoluteTimeGetCurrent();

    NSLog(@"%f", end - begin);

9.imageView回归主线程设置图片方法

    // 回到主线程,显示图片

    [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];

    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

10.gcd

一.创建一个并发队列

dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT);

获得全局的并发队列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

二.创建串行队列

dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_SERIAL);

获得主队列

    dispatch_queue_t queue = dispatch_get_main_queue();

注意点:同一个串行队列不能嵌套同步,比如:

- (void)syncMain

{

    NSLog(@"syncMain ----- begin");

    

    // 1.获得主队列

    dispatch_queue_t queue = dispatch_get_main_queue();

    

    // 2.将任务加入队列

    dispatch_sync(queue, ^{

        NSLog(@"1-----%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"2-----%@", [NSThread currentThread]);

    });

    dispatch_sync(queue, ^{

        NSLog(@"3-----%@", [NSThread currentThread]);

    });

    NSLog(@"syncMain ----- end");

}

这样写,(如果syncMain在子线程执行久不会卡死,否则)程序会卡死。

再比如:

// 1.创建串行队列

    dispatch_queue_t queue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_SERIAL);

    // 2.将任务加入队列

    dispatch_sync(queue, ^{

        NSLog(@"1-----%@", [NSThread currentThread]);

        dispatch_sync(queue, ^{

            NSLog(@"2-----%@", [NSThread currentThread]);

        });

    });

这样写,程序也会卡死。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

多线程

标签:

原文地址:http://www.cnblogs.com/jingdizhiwa/p/5539419.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!