zoukankan      html  css  js  c++  java
  • IOS 创建和使用多线程的6种方式

    非原创  文字来自:http://www.cnblogs.com/yuanjianguo2012/p/3725480.html   纯属复制

    进程和线程概念:

      一个程序包含一个以上的进程,而一个进程又可以包含一个以上的线程,每一个进程都有自己独立的内存空间,相应的一个进程中的所有线程都共享该内存空间。

      进程:是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的资 源分配单元,也是基本的执行单元。独立的地址空间使得不同的进程共享状态信息变得非常困难,为了共享信息,它们必须显式的使用(进程通信机制),进程之间 通信比较慢,因为进程控制和进程序通信机制开销很大。

      线程:进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付 出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。一个线程就是运行在进程上下文的一个逻辑流。现代操作系统允许我们编写一个进程里同 时运行多个线程的程序。线程由内核调度。每个进程开始生命周期时都是单一线程,这个线程称为主线程,在某一时刻,主线程创建一个对等线程。从这个时间点开 始,两个线程就并发运行。最后,因为主线程执行一个慢速系统调用,如read或者sleep,控制就会通过上下文切换传递到对等线程。在控制传递回主线程 前,对等线程会执行一段时间。

      (一) 传统的程序执行方式是一种顺序执行方式,即本句执行完成之后,才会执行下一句。

         在调用一个函数或者执行一个数码块时,执行该程序占用系统主程序的执行时间,也就是说,这个函数或代码块不执行完系统是不会执行下一条指令的:

         例如: 我们在主函数里调用  [self doOneThing];   [self doTheSecondThing];  只有第一个正确执行后才会执行下一个函数。

      (二) 多线程下程序块可以并发执行,大大地节省了程序的执行时间,下面列出创建多线程的几种方式:

          (1)使用performSelectorInBackground创建一个线程:也就是说在程序执行doThing与执行下一段程序是同步执行的

            [self performSelectorInBackground:@selector(doThing) withObject:nil];

        

          (2)直接创建一个线程,selector选择器则指明将要进行的操作,用这种方法时线程直接启动:

            [NSThread detachNewThreadSelector:@selector(doThing) toTarget:self withObject:nil];

          

          (3)创建一个线程并设置启动方式

            NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doThing) object:nil];

                thread.name = @"QingYun";

                    [thread start];

          (4)创建一个多线程的队列

            NSOperationQueue *queue = [[NSOperationQueue alloc] init];

               创建一个操作对象,这个操作对象定义了多线程需要执行作务

               NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doThing) object:nil];

               [queue addOperation:operation];       //    将操作对象放到这个队列里,这样线程就可以直接启动

           (5)使用Block块操作对象的方式创建线程,添加到队列中并启动线程

            NSOperationQueue *queue = [[NSOperationQueue alloc] init];

                NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

                  NSLog(@"do thing....");

                [NSThread sleepForTimeInterval:10];

            }

            [queue addOperation:operation];

           (6)使用队列分发模式创建线程:下面以异步分发创建线程为例说明其工作原理,在异步线程中,在分发时系统对线程按顺序分发下去,但在执行的过程中,则线程之间又存在相互竞争的关系。

            dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

             dispatch_async (queque,^{ 

               [NSThreadsleepForTimeInterval:5];

            };

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

              [NSThreadsleepForTimeInterval:5];

            };

  • 相关阅读:
    5-python基础—获取某个目录下的文件列表(适用于任何系统)
    Automated, Self-Service Provisioning of VMs Using HyperForm (Part 1) (使用HyperForm自动配置虚拟机(第1部分)
    CloudStack Support in Apache libcloud(Apache libcloud中对CloudStack支持)
    Deploying MicroProfile-Based Java Apps to Bluemix(将基于MicroProfile的Java应用程序部署到Bluemix)
    Adding Persistent Storage to Red Hat CDK Kit 3.0 (在Red Hat CDK Kit 3.0添加永久性存储)
    Carve Your Laptop Into VMs Using Vagrant(使用Vagran把您笔记本电脑刻录成虚拟机)
    使用Python生成一张用于登陆验证的字符图片
    Jupyter notebook的安装方法
    Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程
    不同时区的换算
  • 原文地址:https://www.cnblogs.com/tomblogblog/p/3736743.html
Copyright © 2011-2022 走看看