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];

            };

  • 相关阅读:
    [poj] 3068 "Shortest" pair of paths || 最小费用最大流
    [poj] 3686 The Windy's || 最小费用最大流
    [poj] 1235 Farm Tour || 最小费用最大流
    [poj] 3281 Dining || 最大流
    [poj] 3041 Asteroids || 最小点覆盖=最大二分图匹配
    luogu P1072 Hankson 的趣味题
    二分图最佳匹配
    181106 solution
    luogu P2216 [HAOI2007]理想的正方形
    luogu P4362 [NOI2002]贪吃的九头龙
  • 原文地址:https://www.cnblogs.com/tomblogblog/p/3736743.html
Copyright © 2011-2022 走看看