美文网首页
关于线程包活和释放

关于线程包活和释放

作者: 我勒个去的 | 来源:发表于2017-02-04 10:19 被阅读370次

创建线程:

 for (int i = 0; i < 1000000; ++i) {
        //总结:test At: xcode8,ios 9.3.4
        //1,当用CFRunLoopRun(),然后调用CFRunLoopStop,此方法是后果会输出current thread,thread dealloc,current thread,thread dealloc ...所以不会用内存问题
        //2,当用 [runLoop run];,然后调用CFRunLoopStop,此方法会current thread,current thread,... 最后输出[NSThread start]: Thread creation failed with error 35.然后app卡住,然后app crash. 内存不会暴增。但是线程无法销毁
        //3,当用 [runLoop runMode:NSRunLoopCommonModes beforeDate:[NSDate distantFuture]];,然后调用CFRunLoopStop,此方法会。[ViewController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform' crash。是因为 [runLoop runMode:NSRunLoopCommonModes beforeDate:[NSDate distantFuture]]; 无法阻塞线程,所以线程很快执行完run 方法。然后线程exit,导致奔溃(在一个退出的线程,当然这个时候线程没有释放,执行方法奔溃)
        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
        [thread start];
        [self performSelector:@selector(stopThread) onThread:thread withObject:nil waitUntilDone:YES];

    }

- (void)stopThread {
    CFRunLoopStop(CFRunLoopGetCurrent());//该方法可以释放掉该线程。
}

- (void)run {
    @autoreleasepool {
        NSLog(@"current thread = %@", [NSThread currentThread]);
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        if (!self.emptyPort) {
            self.emptyPort = [NSMachPort port];
        }
        [runLoop addPort:self.emptyPort forMode:NSDefaultRunLoopMode];
        // 下面这两种写法都不可取
//        [runLoop run];
//        [runLoop runMode:NSRunLoopCommonModes beforeDate:[NSDate distantFuture]];
        CFRunLoopRun();//通过这种方法开启runloop可以使线程常驻后台并且线程可以释放掉。
        NSLog(@"run over");
    }
}

相关文章

  • 关于线程包活和释放

    创建线程:

  • 线程锁概念

    synchronized 和 volatile 使用 线程抛出异常,锁会被释放 如下demo 如果不想释放那把线程...

  • Runloop小结

    作用: 是一个死循环,保持线程活着,有活干活,没活休眠。而不会让一个线程一个任务执行完了,马上释放掉。 Runlo...

  • 线程的属性

    相关API 初始化和释放 设置线程属性状态 设置线程栈 线程栈大小 线程栈地址 实例

  • iOS 题目详解 部分二

    主要讲解子线程的保活方式, 以及 Autorelease 对象的释放时机 iOS 题目详解 部分一iOS 题目...

  • 多线程下关于NSTimer不释放的问题

    多线程下关于NSTimer不释放的问题 前言 前段时间由于项目需要,用到NSTimer,考虑到不占用主线程资源,故...

  • Synchronized的原理分析

    Java多线程运行环境中,在哪些情况下会使对象锁释放?释放锁: 不释放锁的情况: interrupted()和is...

  • 多线程(一)- 基础回顾

    一些基本概念 1、死锁 线程得到资源却不释放,造成死锁2、活锁 线程相互竞争,得不到可供使用的资源,动态情景造成活...

  • 高并发编程-05-活跃性问题

    死锁,饥饿,活锁 1,死锁 多个线程,各自占对方的资源,都不愿意释放,从而造成死锁 工具:使用jconsole可以...

  • 多线程资源释放

    正常释放 等待线程执行结束,和回收资源。 线程在函数执行结束以后,需要回收资源。线程有两种状态joinable和u...

网友评论

      本文标题:关于线程包活和释放

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