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

        };

时间: 2024-12-20 09:18:02

IOS 创建和使用多线程的6种方式的相关文章

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

关于创建及使用多线程的几种方法

近期刚刚学习了一种多线程技术,现结合自己的理解将其罗列出来,希望能够与大家交流一下,多线程是一种能够节省程序运算时间的方法,大大的提高了程序的运算效率,那么首先我们来说一下进程和线程概念: 一个程序包含一个以上的进程,而一个进程又可以包含一个以上的线程,每一个进程都有自己独立的内存空间,相应的一个进程中的所有线程都共享该内存空间. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的资源分配单元,也是基本的执行单元.

关于GCD学习,创建及使用多线程的几种方法

近期刚刚学习了一种多线程技术,现结合自己的理解将其罗列出来,希望能够与大家交流一下,多线程是一种能够节省程序运算时间的方法,大大的提高了程序的运算效率,那么首先我们来说一下进程和线程概念: 一个程序包含一个以上的进程,而一个进程又可以包含一个以上的线程,每一个进程都有自己独立的内存空间,相应的一个进程中的所有线程都共享该内存空间. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的资源分配单元,也是基本的执行单元.

线程的状态以及创建多线程的三种方式

首先了解一下线程的五种状态: 新建状态: 新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内的程序代码. 就绪状态: 简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度. 运行状态: 获得cpu的时间后,调用run()方法,进入运行状态. 阻塞状态: 由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用. 死亡状态: 线程正常执行完毕,或

java实现多线程的三种方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口 1.继承Thread类,重写父类run()方法   public class thread1 extends Thread {           public void run() {                 for (int i = 0; i < 10000; i++) {                         System.out.println("我是线程"+this.get

iOS开发 跳转场景的三种方式

假设A跳转到B,三种方法: 1.按住ctrl键,拖动A上的控件(比如说UIButton)到B上,弹出菜单,选择Modal.不需要写任何代码,在A上点击Button就会跳转到B 2. 按住ctrl键,拖动A上的View Controller到B上,弹出菜单,选择Modal,两个场景间自动添加连接线和图标,选中该图标,打开Storyboard Segue,identifier输入一个标识符,这里以”aaaa”为例.A里需要跳转时,执行下面的代码: 1 [self performSegueWithId

Java实现多线程的两种方式

实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对象. 问题: a. 为什么要重写run方法? run()方法里封装的是被线程执行的代码 b. 启动线程对象用的是哪个方法? start()方法 c. run()和start()方法的区别? 直接调用run方法只是普通的方法调用 调用start方法先会启动线程,再由jvm调用run()方法 方式2:

ios给NSMutableDictionary循环赋值的两种方式,在循环内初始化NSMutableDictionary和在循环外初始化NSMutableDictionary有何区别?(已解决)

NSMutableArray * arrayName = [NSMutableArray array]; NSMutableArray * array = [NSMutableArray array]; [array removeAllObjects]; for (int i = 0; i< 10; i++) { NSString * str = [NSString stringWithFormat:@"name%i",i]; [arrayName addObject:str];

c#使用多线程的几种方式示例详解

本文转载自:http://www.jb51.net/article/46234.htm 本文章主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧 (1)不需要传递参数,也不需要返回参数 ThreadStart是一个委托,这个委托的定义为void ThreadStart(),没有参数与返回值. 复制代码 代码如下: class Program { static void Main(string[] args) { for (int i = 0; i < 30; i