概述
-
线程的生命周期是怎样的?
对于子线程,默认情况下它只会执行一次,执行完成后就会变为 finished 状态,只能销毁再创建。 -
常驻线程
我们想让线程变为常驻线程,实时听从调度,应该使用 Runloop。 -
线程与 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];
}
总结
在日常开发中,可以将耗时操作放在子线程,如果必要的话,使子线程常驻,这样就能不停的执行耗时操作,并且不影响到主线程。
网友评论