在实际开发过程中 怎样控制线程的生命周期?(也就是线程保活)
在面试过程中我们经常会被问到线程保活的问题,下面将研究 iOS开发中如何控制线程的生命周期
首先我们先了解一些概念:
线程和runloop是一对一的关系,一个线程中有且只有一个runloop runloop会在线程结束时销毁。子线程的runloop并不会主动创建和开启。
runloop 顾名思义就是运行循环,让程序在运行中一直循环做事情。想要让线程保活就必须开启线程的runloop
下面封装一个可以控制线程生命周期的工具类
PermenantThread.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef void (^PermenantThreadTask)(void);
@interface PermenantThread : NSObject
/**
在当前子线程执行一个任务
*/
- (void)executeTask:(PermenantThreadTask)task;
/**
结束线程
*/
- (void)stop;
@end
NS_ASSUME_NONNULL_END
PermenantThread.m
#import "PermenantThread.h"
@interface PermenantThread()
@property (strong, nonatomic) NSThread *myThread;
@property (assign, nonatomic, getter=isStopped) BOOL stopped;
@end
@implementation PermenantThread
#pragma mark - public methods
- (instancetype)init{
if (self = [super init]) {
self.stopped = NO;
__weak typeof(self) weakSelf = self;
self.myThread = [[NSThread alloc] initWithBlock:^{
[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
while (weakSelf && !weakSelf.isStopped) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}];
[self.myThread start];
}
return self;
}
- (void)executeTask:(PermenantThreadTask)task{
if (!self.myThread || !task) return;
[self performSelector:@selector(__executeTask:) onThread:self.myThread withObject:task waitUntilDone:NO];
}
- (void)stop{
if (!self.myThread) return;
[self performSelector:@selector(__stop) onThread:self.myThread withObject:nil waitUntilDone:YES];
}
- (void)dealloc{
NSLog(@"%s", __func__);
[self stop];
}
#pragma mark - private methods
- (void)__stop{
self.stopped = YES;
CFRunLoopStop(CFRunLoopGetCurrent());
self.myThread = nil;
}
- (void)__executeTask:(PermenantThreadTask)task{
task();
}
@end
网友评论