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

2020-09-16  本文已影响0人  NapoleonY

概述

  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创建一个常驻线程
上一篇下一篇

猜你喜欢

热点阅读