美文网首页
线程的生命周期以及常驻线程

线程的生命周期以及常驻线程

作者: NapoleonY | 来源:发表于2020-09-16 21:04 被阅读0次

    概述

    1. 线程的生命周期是怎样的?
      对于子线程,默认情况下它只会执行一次,执行完成后就会变为 finished 状态,只能销毁再创建。

    2. 常驻线程
      我们想让线程变为常驻线程,实时听从调度,应该使用 Runloop。

    3. 线程与 Runloop 的关系
      iOS 中 Runloop 和线程是一一对应的,并且 runloop 是管理线程的。当线程的 Runloop 被开启后,线程会在执行完毕任务后进入休眠状态,有了任务就会被唤醒去执行任务。默认情况下子线程的 runloop 是不会被创建的,除非我们去调用它

    实例

    创建一个线程
    @property (nonatomic, strong) NSThread *testThread;
    
    - (void)threadTest {
        _testThread = [[NSThread alloc] initWithBlock:^{
            NSLog(@"线程创建成功,%@", NSThread.currentThread);
        }];
        [_testThread start];
    }
    
    - (void)btnPressed:(UIButton *)btn {
            [self performSelector:@selector(doSth) onThread:self.testThread withObject:nil waitUntilDone:NO];
    }
    
    - (void)doSth {
        NSLog(@"线程中打印 %@", NSThread.currentThread);
    }
    

    代码一开始会打印“线程创建成功”,然后我们点击 btn,会发现没有任何反应。在点击事件出打断点,发现这个线程还是存在的,但是不起作用。

    解决方法

    在创建线程时,在 block 中创建 Runloop ,并向 Runloop 添加 port,使 Runloop 不至于退出

    - (void)threadTest {
        _testThread = [[NSThread alloc] initWithBlock:^{
            NSLog(@"线程创建成功,%@", NSThread.currentThread);
            [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSRunLoopCommonModes];
            [[NSRunLoop currentRunLoop] run];
        }];
        [_testThread start];
    }
    

    总结

    在日常开发中,可以将耗时操作放在子线程,如果必要的话,使子线程常驻,这样就能不停的执行耗时操作,并且不影响到主线程。

    参考

    1. iOS通过runloop实现常驻线程
    2. iOS 利用RunLoop创建一个常驻线程

    相关文章

      网友评论

          本文标题:线程的生命周期以及常驻线程

          本文链接:https://www.haomeiwen.com/subject/gbnhyktx.html