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

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

作者: 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创建一个常驻线程

相关文章

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

    概述 线程的生命周期是怎样的?对于子线程,默认情况下它只会执行一次,执行完成后就会变为 finished 状态,只...

  • 1.线程基础 -《多线程编程实战》

    1.线程基础 -《多线程编程实战》线程的生命周期,包括创建线程、挂起线程、线程等待,以及中止线程。 1.2 创建线...

  • 关于上一篇"RunLoop 学习笔记"存在问

    上一篇中问题, 实现"常驻线程"的方案 上一篇"RunLoop 学习笔记"中是这么介绍常驻线程, 以及对应实现方法...

  • 浏览器和主引擎

    浏览器是多线程,js是异步单线程 ps:常驻线程一直存在,一直在待命。非常驻线程有需求的时候线程才会工作。 常驻线...

  • 17 | 远超你想象的多线程的那些坑

    我们就一起来看看多线程技术常见的两个大坑,常驻线程和并发问题,分别是从何而来,以及如何避免吧。常驻线程我们先说说多...

  • Java知识总结之Thread

    1 线程的生命周期 每个线程都有自己的局部变量表、程序计数器以及生命周期。 上图就时一个线程的生命周期图,答题可以...

  • Java中线程的了解以及生命周期?

    Java中线程的了解以及生命周期?

  • 线程池几个重要参数

    corePoolSize 线程池中常驻线程核心线程数 maximumPoolSize 线程池中同时容纳可执行的线程...

  • RunLoop总结以及常驻线程

    一. RunLoop 总结 1. RunLoop 基础 RunLoop就是一个运行循环,每一条线程对应其惟一的Ru...

  • 常驻线程

    模仿曾经的AFN常驻线程写法,现在的YY的写法也是如此 使用performSelector: onThread:简...

网友评论

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

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