博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程 -- NSThread
阅读量:5155 次
发布时间:2019-06-13

本文共 1755 字,大约阅读时间需要 5 分钟。

NSThread

  • NSThread

    • 一个NSThread对象就代表一条线程
  • 创建线程的几种方式

  • alloc/init
// 1.创建线程    NJThread *thread = [[NJThread alloc] initWithTarget:self selector:@selector(demo:) object:@"lnj"];    // 设置线程名称    [thread setName:@"xmg"];    // 设置线程的优先级    // 优先级仅仅说明被CPU调用的可能性更大    [thread setThreadPriority:1.0];    // 2.启动线程    [thread start];
  • 线程的相关用法
+ (NSThread *)mainThread; // 获得主线程- (BOOL)isMainThread; // 是否为主线程//获得当前线程NSThread *current = [NSThread currentThread];//线程的名字- (void)setName:(NSString *)n;- (NSString *)name;
  • 其他创建线程的方式
    • 优点:简单快捷
    • 缺点:无法对线程进行更详细的设置
// 1.创建线程
[NSThread detachNewThreadSelector:@selector(demo:) toTarget:self withObject:@"lnj"];
// 1.创建线程 // 注意: Swift中不能使用, 苹果认为这个方法不安全
[self performSelectorInBackground:@selector(demo:) withObject:@"lnj"];
  • 线程状态

启动线程- (void)start;// 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态阻塞(暂停)线程+ (void)sleepUntilDate:(NSDate *)date;+ (void)sleepForTimeInterval:(NSTimeInterval)ti;// 进入阻塞状态强制停止线程+ (void)exit;// 进入死亡状态

注意:一旦线程停止(死亡)了,就不能再次开启任务

  • 多线程的安全隐患

    • 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
  • 线程锁

    • 被锁定的代码同一时刻只能有一个线程执行
@synchronized(锁对象) { // 需要锁定的代码  }
  • 互斥锁的优缺点 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源

  • 互斥锁注意点

    • 锁定1份代码只用1把锁,用多把锁是无效的
    • 锁定范围越大, 性能越差

  • 原子和非原子属性

    • atomic:线程安全,需要消耗大量的资源
    • nonatomic:非线程安全,适合内存小的移动设备
  • 自旋锁 & 互斥锁

    • 共同点 都能够保证同一时间,只有一条线程执行锁定范围的代码
    • 不同点
      • 互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入"休眠"状态,等待其他线程执行完毕,打开锁之后,线程会被"唤醒"
      • 自旋锁:如果发现有其他线程正在执行锁定的代码,线程会"一直等待"锁定代码执行完成! 自旋锁更适合执行非常短的代码!

  • 线程间通信
    • 子线程做耗时操作, 主线程更新数据
[self performSelectorInBackground:@selector(download) withObject:nil];    /*     waitUntilDone是否等待被调用方法执行完成,有可能也会等待调用方法的执行完成!     YES: 等待被调用线程执行完毕再执行后面的代码     NO : 不用等待被调用线程执行完毕就可以执行后面的代码     */[self performSelectorOnMainThread:@selector(showImage:) withObject:[UIImage imageWithData:data] waitUntilDone:YES];

 

转载于:https://www.cnblogs.com/Apolla/p/4737984.html

你可能感兴趣的文章
Linux Kernel API
查看>>
oracle学习
查看>>
【C语言项目】贪吃蛇游戏(下)
查看>>
DevExpress第三方控件汉化的全部代码和使用方法
查看>>
二分查找算法(C#实现)
查看>>
vue项目中开启Eslint碰到的一些问题及其规范
查看>>
ES terms多值搜索及范围过滤深入剖析-搜索系统线上实战
查看>>
大咖专栏 | DevOps组织如何有效地实施MSA
查看>>
工厂模式
查看>>
忍不住了, 和大家聊聊怎么写简历吧, 关于简历的深度思考
查看>>
高并发编程
查看>>
(前端)html与css css 19、tab栏
查看>>
一起来学习.net core程序使用中介者模式:MediatR插件
查看>>
debian9 设置
查看>>
5句话搞定ES5作用域
查看>>
Build tool
查看>>
php 小坑记录
查看>>
2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
查看>>
通过 poi 导入 Excel代码
查看>>
《CSS基础教程》 读书笔记三
查看>>