zoukankan      html  css  js  c++  java
  • 多线程 NSThread

    多线程
    NSThread

    创建和启动线程

    一个NSThread对象就代表一条线程

    创建、启动线程

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

    [thread start];

    // 线程一启动,就会在线程thread中执行self的run方法

    主线程相关用法

    + (NSThread *)mainThread; // 获得主线程

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

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

    其他用法

    获得当前线程

    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;

    其他创建线程方式

    创建线程后自动启动线程

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

    隐式创建并启动线程

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

    上述2种创建线程方式的优缺点

    p优点:简单快捷
    p缺点:无法对线程进行更详细的设置

    线程的状态

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

    [thread start];

    控制线程状态

    启动线程

    - (void)start;

    // 进入就绪状态 -> 运行状态。当线程任务执行完毕,自动进入死亡状态

    阻塞(暂停)线程

    + (void)sleepUntilDate:(NSDate *)date;

    + (void)sleepForTimeInterval:(NSTimeInterval)ti;

    // 进入阻塞状态

    强制停止线程

    + (void)exit;

    // 进入死亡状态

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

    多线程的安全隐患

    资源共享

    p1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
    p比如多个线程访问同一个对象、同一个变量、同一个文件

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

    安全隐患示例01 – 存钱取钱

    安全隐患示例02 – 卖票

    安全隐患分析

    安全隐患解决 – 互斥锁

    安全隐患解决 – 互斥锁

    互斥锁使用格式

    @synchronized(锁对象) { // 需要锁定的代码  }

    注意:锁定1份代码只用1把锁,用多把锁是无效的

    互斥锁的优缺点

    p优点:能有效防止因多线程抢夺资源造成的数据安全问题
    p缺点:需要消耗大量的CPU资源
    p

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

    p

    相关专业术语:线程同步

    p线程同步的意思是:多条线程按顺序地执行任务
    p互斥锁,就是使用了线程同步技术
    p
    ü

    原子和非原子属性

    OC在定义属性时有nonatomic和atomic两种选择

    patomic:原子属性,为setter方法加锁(默认就是atomic)
    pnonatomic:非原子属性,不会为setter方法加锁
    p

    atomic加锁原理

    @property (assign, atomic) int age;

    - (void)setAge:(int)age

    {

        @synchronized(self) {

            _age = age;

        }

    }

    原子和非原子属性的选择

    nonatomic和atomic对比

    patomic:线程安全,需要消耗大量的资源
    pnonatomic:非线程安全,适合内存小的移动设备
    p

    iOS开发的建议

    p所有属性都声明为nonatomic
    p尽量避免多线程抢夺同一块资源
    p尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

    线程间通信

    什么叫做线程间通信

    p在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
    p

    线程间通信的体现

    p1个线程传递数据给另1个线程
    p在1个线程中执行完特定任务后,转到另1个线程继续执行任务
    p

    线程间通信常用方法

    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

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

    p
    p

    线程间通信示例 – 图片下载

  • 相关阅读:
    将Nginx添加到windows服务中
    springboot使用redis管理session
    GIT常用命令
    阻止360、谷歌浏览器表单自动填充
    谈谈对Spring IOC的理解
    同一个Nginx服务器同一端口配置多个代理服务
    LeetCode 653. Two Sum IV
    109. Convert Sorted List to Binary Search Tree(根据有序链表构造平衡的二叉查找树)
    108. Convert Sorted Array to Binary Search Tree(从有序数组中构造平衡的BST)
    LeetCode 236. Lowest Common Ancestor of a Binary Tree(二叉树求两点LCA)
  • 原文地址:https://www.cnblogs.com/niexiaobo/p/4888681.html
Copyright © 2011-2022 走看看