首页 > 其他分享 >使用Runloop线程常驻

使用Runloop线程常驻

时间:2024-03-13 14:23:45浏览次数:13  
标签:nil shareThread selector 常驻 线程 NSThread Runloop

NSThread+runloop实现常驻线程

NSThread在实际开发中比较常用到的场景就是去实现常驻线程。

由于每次开辟子线程都会消耗cpu,在需要频繁使用子线程的情况下,频繁开辟子线程会消耗大量的cpu,而且创建线程都是任务执行完成之后也就释放了,不能再次利用,那么如何创建一个线程可以让它可以再次工作呢?也就是创建一个常驻线程。
首先常驻线程既然是常驻,那么我们可以用GCD实现一个单例来保存NSThread

+ (NSThread *)shareThread {
    
    static NSThread *shareThread = nil;
    
    static dispatch_once_t oncePredicate;
    
    dispatch_once(&oncePredicate, ^{
        
        shareThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadTest) object:nil];
 
        [shareThread setName:@"threadTest"];
        
        [shareThread start];
    });
    
    return shareThread;
}
 
这样创建的thread就不会销毁了吗?
 
[self performSelector:@selector(test) onThread:[ViewController shareThread] withObject:nil waitUntilDone:NO];
 
- (void)test
{
    NSLog(@"test:%@", [NSThread currentThread]);
}
 
并没有打印,说明test方法没有被调用。
那么可以用runloop来让线程常驻
 
+ (NSThread *)shareThread {
    
    static NSThread *shareThread = nil;
    
    static dispatch_once_t oncePredicate;
    
    dispatch_once(&oncePredicate, ^{
        
        shareThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadTest2) object:nil];
        
        [shareThread setName:@"threadTest"];
        
        [shareThread start];
    });
    
    return shareThread;
}
 
+ (void)threadTest
{
    @autoreleasepool {
        
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        
        [runLoop run];
    }
}

 

 


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/tfy_2425482491/article/details/75214148

标签:nil,shareThread,selector,常驻,线程,NSThread,Runloop
From: https://www.cnblogs.com/huangzs/p/18070546

相关文章

  • 深入浅出Java多线程(十二):线程池
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十二篇内容:线程池。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代软件开发中,多线程编程已经成为应对高并发、高性能场景的必备技术。随着计算机硬件的发展,尤其是多核CPU的普及,利用多线程能够......
  • 在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
    写在开头经过上几篇博文的学习,我们知道在Java中可以通过newThread().start()创建一个线程,那今天我们就来思考另外一个问题:线程的终止自然终止有两种情况:1.线程的任务执行完成;2.线程在执行任务过程中发生异常。start之后,如果线程没有走到终止状态,我们该如何停止这个线程......
  • Windows编程系列:远线程注入
    远线程注入远线程(RemoteThread)注入是指一个进程在另一个进程中创建线程的技术,这是一种很经典的DLL注入技术。虽然比较古老,但是很实用。通过远线程注入,再配合api函数的hook技术,可以实现很多有意思的功能。  实现远线程注入的关键函数OpenProcess打开现有的本地进程,函数......
  • 多线程系列(十八) -AQS原理浅析
    一、摘要在之前的文章中,我们介绍了ReentrantLock、ReadWriteLock、CountDownLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等并发工具类的使用方式,它们在请求共享资源的时候,都能实现线程同步的效果。在使用方式上稍有不同,有的是独占式,多个线程竞争时只有一个线程能执......
  • 12-多线程
    进程和线程多线程是Java语言的重要特性,大量应用于网络编程、服务器端程序的开发,最常见的UI界面底层原理、操作系统底层原理都大量使用了多线程。我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层就是多线程的应用。UI界面的主线程绘制界面,如果有一个耗时的操作发生则启动新......
  • 【JavaEE初阶系列】——多线程 之 创建进程
    目录......
  • 简易线程池的实现
    Worker的实现 总体来说我们首先需要实现一个Worker线程类,让他的线程实例拿取任务然后执行任务。//worker主要是从jobs中拿工作,拿不到等,拿到了执行。classWorkerimplementsRunnable{privatevolatilebooleanrunning=true;@Override......
  • windows、C++怎么看线程在哪个核上运行
    一.要在Windows系统上查看线程运行在哪个处理器核心上,可以使用Windows系统提供的一些工具和方法。在Windows中,可以使用以下几种方式来查看线程运行的处理器核心:使用任务管理器打开任务管理器:可以通过按下 Ctrl+Shift+Esc 组合键快速打开任务管理器,或者通过右键......
  • 并发编程之进程与线程和并行与并发的详细解析
    2.1进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了......
  • PySide6之子线程
    QThread方法1:子类化创建多线程创建子线程,继承自QThread类在子线程中自定义信号在子线程中重写run()方法,进行信号的触发在主线程中实例化子线程在主线程中对子线程的信号进行绑定在主线程中开启子线程importtimefromPySide6.QtCoreimport*fromPySide6.QtWidgets......