zoukankan      html  css  js  c++  java
  • iOS多线程之1.从Thread看多线程的生命周期

      Thread 是多线程中最容易理解,但是使用起来又是最麻烦的一种多线程方法。为什么说容易理解呢?一个NSThread的对象就是一条线程。使用起来麻烦是因为,需要我们自己管理线程的生命周期:创建线程、调度任务、销毁线程。

    首先我们开始创建线程:

    ​第一种方法:

    NSThread *thread = [[NSThread alloc] initWithBlock:^{   
    
    //调度任务,例如下载图片,往服务器上传文件等一切耗费时间的操作
    
    ​}];
    

    ​ 也可以用下面的方法:

     - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
    
    id :消息发送的对象;
    selector:要传递的消息,消息就是我们要调度的任务。;
    argument:传递的参数,只能有一个,不过我们可以把多个参数封装成一个字典。
    

    就这样一条线程就创建完成了。但是创建完一条线程,线程就会执行任务吗。当然不是,你得开启它,不然它是不会执行任务的。
    [thread start];

    线程销毁

      当子线程的任务执行完之后,子线程会自动退出。默认执行[NSThread exit]方法。当系统完成任务之后,会发送一个通知“NSThreadWillExitNotification”,我们可以添加观察者来监听线程的退出:

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(threadfinishTask:) name:NSThreadWillExitNotification object:nil];
    
      - (void)threadfinishTask:(NSNotification *)notification{
    
     NSLog(@"threadfinishTask");
    
     NSLog(@"%@",notification.userInfo);
    
     }
    

    打印结果:

    我们发现userInfo为空,证明没有什么通知信息。我们可以在这个方法写子线程完成之后的操作,与主线程通信。

      个人理解,如果想研究多线程编程还得从Thread开始。因为Thread逻辑并不复杂,封装的层级相对较低,我们要自己管理线程的生命周期、同步、加锁等问题,这会加深我们对多线程编程的理解,但是也会造成一定的性能开销。但用的时候应该多以Cocoa Operations和Grand Central Dispatch为主,尤其是Cocoa Operations,它更灵活,可以很轻易的处理复杂的情况。

       个人原创,欢迎转载。可以关注我的博客。我会定期分享一下iOS,开发方面的知识,大家有什么意见可以给我发私信。

  • 相关阅读:
    day40 JavaScript初识
    day39 CSS层叠样式表-01
    day38 HTML基础
    day35 数据操作补充和单表操作
    day33 数据库初识
    day27 线程同步
    day25 多进程
    day24 内置方法,异常机制
    ROS 进阶学习笔记(12)
    ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM
  • 原文地址:https://www.cnblogs.com/doujiangyoutiao/p/6029603.html
Copyright © 2011-2022 走看看