开启线程需要占用一定的内存空间(默认的情况下,主线程占1M,子线程占用512KB)且每次开辟子线程都会消耗CPU。如果频繁使用子线程的情况下,频繁开辟释放子线程会消耗大量的CPU和内存,而且创建的线程中的任务执行完成之后也就释放了,不能再次利用,所以造成资源和性能的浪费。这种情况下可以通过创建一个常驻线程来解决。
常驻线程通过NSThread与runloop来实现。新建的子线程默认没有开启runloop,因此需要给这个线程添加了一个runloop,并且加了一个NSMachPort端口监听,防止新建的线程由于没有活动直接退出。
常驻线程
#pragma mark- 异步常驻线程
+ (void)logThreadEntryPoint:(id)__unused object {
@autoreleasepool {
[[NSThread currentThread] setName:@"com.log.LOGServiceThread"];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
+ (NSThread *)logThread {
static NSThread *_logThread = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_logThread = [[NSThread alloc] initWithTarget:self selector:@selector(logThreadEntryPoint:) object:nil];
[_logThread start];
});
return _logThread;
}
使用
[self performSelector:@selector(token) onThread:[[self class] logThread] withObject:nil waitUntilDone:NO];
退出
[NSRunLoop currentRunLoop]removePort:<#(nonnull NSPort *)#> forMode:<#(nonnull NSRunLoopMode)#>
只有从runloop中移除我们之前添加的端口,这样runloop没有任何事件,所以直接退出。
- 参考资料
网友评论