专栏首页老沙课堂多线程(一) 有关死锁以及串行并发同步异步概念

多线程(一) 有关死锁以及串行并发同步异步概念

多线程(一) 有关死锁以及串行并发同步异步概念

多线程

1、并发 串行 异步 同步

并发 串行 是指队列
异步同步 只是是否能开启线程
举个?

并发队列 (双行(多行)道路 可以超车 只要你可以)

可以让多个任务并发执行 (异步的时候可以超车 所以可以并发)

同步或者异步 (你有没有超车的能力) 是否具备开启新线程的能力

串行队列 (单行线)

任务一个接一个 无论同步还是异步 (无论有没有超车能力都只能一条线)

  • ==队列(串行并发) 决定了运行方式==
  • ==同步异步 决定了能否开启新线程的能力 (主队列只在主线程)==

2、死锁

案例1

题目:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0];
        NSLog(@"3");
    });
}

- (void) test {
    NSLog(@"2");
}
执行结果:
2019-09-01 17:55:37.962948+0800 GCD[16903:233631] 1
2019-09-01 17:55:37.963250+0800 GCD[16903:233631] 3	
复制代码
分析原因:

未执行原因:RunLoop未开启 消息添加到RunLoop中也不会被调用。

performSelector: withObject: 底层调用[self msgSend];

performSelector: withObject:afterDelay; RunLoop相关

往RunLoop里面添加一个定时器

解决办法::

开启线程RunLoop

案例2

题目:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
    }];
    [thread start];
    [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
    NSLog(@"3");
}

- (void) test {
    NSLog(@"2");
}
执行结果:
2019-09-01 18:23:51.670983+0800 GCD[17915:253178] 1
2019-09-01 18:23:51.674352+0800 GCD[17915:253102] *** Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[ViewController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform'
...	
分析原因:

block执行完毕后 线程没有开启RunLoop。所以线程销毁,销毁后再调用所以崩溃。

解决办法:

开启RunLoop

NSThread *thread = [[NSThread alloc] initWithBlock:^{
        NSLog(@"1");
        [[NSRunLoop currentRunLoop] addPort:[NSPort new] forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    }];

本文分享自微信公众号 - 老沙课堂(gh_f73a6b772d4f),作者:rui4u

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅入深出Copy和mutableCopy

    由Tagged Pointed 可以知道a b 为Tagged Pointer 对象 想深入了解的的可以看一下我的上一篇文章

    老沙
  • RunLoop详解

    线程刚创建的时候没有Ru nLoop对象,RunLoop会在第一次获取它的时候创建

    老沙
  • isa详解(一)isa结构

    为什么要用union以及位运算呢。因为在计算机中为二进制。位运算是最快速的计算方式 union C++ 中的共用体。顾名思义 就是在union 中 公用一个内存...

    老沙
  • Spring Data Redis使用

    上文我们介绍了Redis,在开发环境中,我们还有另外一个解决方案,那就是Spring Data Redis。本文我们就来看看这个东西。

    江南一点雨
  • SpringMVC-03 RestFul和控制器

    Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    张小驰出没
  • 小米Mini路由器 手机设置上网

    1、先把你的小米路由器接通电源,打开手机上的WLAN功能,搜索连接到小米路由器的无线信号,如下所示。

    砸漏
  • Spring 注入集合的成员变量属性

    看一个例子:JavaCollection这个类包含了上述介绍的4种集合类型的成员变量:

    Jerry Wang
  • SAP Cloud Platform上Fiori launchpad tile的读取原理

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • SAP Cloud Platform上Fiori launchpad tile的读取原理

    下图是Fiori on HANA HCP的architecture: 我们的Fiori UI不再是存在netweaver的BSP application里,而...

    Jerry Wang
  • 基于java的行列式计算程序

    一头小山猪

扫码关注云+社区

领取腾讯云代金券