zoukankan      html  css  js  c++  java
  • iOS多线程与网络开发之多线程NSThread

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

    假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 

    我要捐赠: 点击捐赠

    Cocos2d-X源代码下载:点我传送

    游戏官方下载:http://dwz.cn/RwTjl

    游戏视频预览:http://dwz.cn/RzHHd

    游戏开发博客:http://dwz.cn/RzJzI

    游戏源代码传送http://dwz.cn/Nret1


    A.NSThread的基本使用
    1.创建和启动线程
    一个NSThread对象就代表一条线程

    创建、启动线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    [thread start];
    // 线程一启动。就会在线程thread中运行self的run方法

    主线程相关用法
    + (NSThread *)mainThread; // 获得主线程
    - (BOOL)isMainThread; // 是否为主线程
    + (BOOL)isMainThread; // 是否为主线程
     
    2.其它方法
    获得当前线程
    NSThread *current = [NSThread currentThread];

    线程的调度优先级
    + (double)threadPriority;
    + (BOOL)setThreadPriority:(double)p;
    - (double)threadPriority;
    - (BOOL)setThreadPriority:(double)p;
    调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高

    线程的名字
    - (void)setName:(NSString *)n;
    - (NSString *)name;
     
    3.其它创建线程的方法
    创建线程后自己主动启动线程
    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

    隐式创建并启动线程
    [self performSelectorInBackground:@selector(run) withObject:nil];

    上述2种创建线程方式的优缺点
    长处:简单快捷
    缺点:无法对线程进行更具体的设置
     
    4.线程生命周期
    Image(34)
     
    5.控制线程转台
    启动线程
    - (void)start;
    // 进入就绪状态 -> 运行状态。当线程任务运行完成。自己主动进入死亡状态

    堵塞(暂停)线程
    + (void)sleepUntilDate:(NSDate *)date;
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;
    // 进入堵塞状态

    强制停止线程
    + (void)exit;
    // 进入死亡状态

    注意:一旦线程停止(死亡)了。就不能再次开启任务
     
    6.多线程的安全隐患
    资源共享
    1块资源可能会被多个线程共享。也就是多个线程可能会訪问同一块资源
    比方多个线程訪问同一个对象、同一个变量、同一个文件

    当多个线程訪问同一块资源时,非常easy引发数据错乱和数据安全问题
     
    7.相互排斥锁(为了预防多线程的资源抢夺)
    (1)相互排斥锁使用格式
    @synchronized(锁对象) { // 须要锁定的代码  }
    注意:锁定1份代码仅仅用1把锁,用多把锁是无效的

    相互排斥锁的优缺点
    长处:能有效防止因多线程抢夺资源造成的数据安全问题
    缺点:须要消耗大量的CPU资源

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

    相关专业术语:线程同步
    线程同步的意思是:多条线程按顺序地运行任务
    相互排斥锁。就是使用了线程同步技术
     
    (2)加锁@synchronized
    @property(nonatomic, strong) NSObject *lock;
    self.lock = [[NSObject alloc] init]
    @synchronized (self.lock){
    ...
    }
    注意:要用同一个“锁”,才干正确地锁住代码资源
     
    长处:有效防止多线程抢夺资源
    缺点:消耗大量CPU资源
     
    事实上成员属性修饰符atomic就加锁,这是默认的
    所以我们一般使用nonatomic。提高性能
     
    尽量避免多线程抢夺资源
    尽可能把抢夺资源的处理交给server端来处理
     
    (3)关于atomic和nonatomic修饰符
    OC在定义属性时有nonatomic和atomic两种选择
    atomic:原子属性,为setter方法加锁(默认就是atomic)
    nonatomic:非原子属性,不会为setter方法加锁

    atomic加锁原理
    @property (assign, atomic) int age;
    - (void)setAge:(int)age
    {
        @synchronized(self) {
            _age = age;
        }
    }
     
    (4)atomic vs nonatomic
    nonatomic和atomic对照
    atomic:线程安全。须要消耗大量的资源
    nonatomic:非线程安全,适合内存小的移动设备

    iOS开发的建议
    全部属性都声明为nonatomic
    尽量避免多线程抢夺同一块资源
    尽量将加锁、资源抢夺的业务逻辑交给server端处理,减小移动client的压力
     
    8.线程间通信
    什么叫做线程间通信
    在1个进程中。线程往往不是孤立存在的,多个线程之间须要经常进行通信

    线程间通信的体现
    1个线程传递数据给另1个线程
    在1个线程中运行完特定任务后,转到另1个线程继续运行任务

    线程间通信经常用法
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

    假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 

    我要捐赠: 点击捐赠

    Cocos2d-X源代码下载:点我传送

    游戏官方下载:http://dwz.cn/RwTjl

    游戏视频预览:http://dwz.cn/RzHHd

    游戏开发博客:http://dwz.cn/RzJzI

    游戏源代码传送http://dwz.cn/Nret1

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6741009.html
Copyright © 2011-2022 走看看