zoukankan      html  css  js  c++  java
  • iOS开发——高级篇——线程保活

    线程保活

    顾名思义,就是保护线程不死(保证线程处于激活状态,生命周期没有结束)

    正常情况,当线程执行完一次任务之后,需要进行资源回收,也就意味着生命周期结束

    应用场景

    当有一个任务,随时都有可能去执行它,那么应该放在子线程去执行,并且让子线程一直存活着,避免执行多次任务做多次创建销毁线程的动作,降低性能消耗

    注意:只适用于非并发(一个线程嘛)

    笔者利用runloop结合线程相关知识封装了一个小框架  https://github.com/chglog/CHGPermenantThread

    提供三个接口:

    /**
     开启线程,默认自动开启
     */
    - (void)run;
    
    /**
     在当前子线程执行一个任务
     */
    - (void)executeTask:(CHGPermenantThreadTask)task;
    
    /**
     结束线程,默认CHGPermenantThread销毁时自动结束线程
     */
    - (void)stop;

    用法:

        // 创建一个保活线程,直到ViewController销毁,或者主动调用stop
        self.thread = [[CHGPermenantThread alloc] init];
    
        [self.thread executeTask:^{
            // 你要在子线程里做的事情
            NSLog(@"执行任务 - %@", [NSThread currentThread]);
        }];
        // 主动销毁该子线程
        [self.thread stop];

    OC版本核心实现代码:

    self.innerThread = [[CHGThread alloc] initWithBlock:^{
                // 往RunLoop里面添加SourceTimerObserver
                [[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
                
                // 只要没有主动或被动退出loop 那么就继续让loop跑起来
                while (weakSelf && !weakSelf.isStopped) {
                    // 这个方法在没有任务时就睡眠  任务完成了就会退出loop
                    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
                }
            }];

     C语言版本核心实现代码:

    self.innerThread = [[MJThread alloc] initWithBlock:^{

    // 创建上下文(要初始化一下结构体) CFRunLoopSourceContext context = {0}; // 创建source CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context); // 往Runloop中添加source CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode); // 销毁source CFRelease(source); // 启动 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, false); }];
  • 相关阅读:
    【2017.12.02普及组模拟】送快递
    【NOIP2013模拟联考7】OSU
    顺序表元素位置倒置示例c++实现
    c++字符串排序
    JAVA实现四则运算的简单计算器
    JAVA图形小动画之简单行星运动
    JAVA多线程编程
    ege图形库之简单贪吃蛇(c++)
    ege图形库之动画排序
    c语言中一种典型的排列组合算法
  • 原文地址:https://www.cnblogs.com/chglog/p/9585068.html
Copyright © 2011-2022 走看看