IOS-多线程的创建

一.程序 进程 线程

程序:由源代码生成的可执行应用.

进程:一个正在运行的程序可以看做一个进程

线程:程序中独立运行的代码段


****一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程是程序真正的执行单元,只负责代码的执行.



二.单线程 多线程

<单线程>
每个正在运行的程序(即进程),至少包含一个线程,这个线程叫主线程
主线程在程序启动时被创建,用于执行main函数.
****只有一个主线程的程序,称作单线程程序.
****主线程负责执行程序的所有代码(UI展现以及刷新,网络请求,本地存储等等)
      这些代码只能顺序执行,无法并发执行.

<多线程>

拥有多个线程的程序,称作多线程程序

子线程和主线程是都是独立运行的单元,各自的执行互不影响,因此能并发执行

用多线程的三种情况:
1)大量运算(如for循环)  
2)数据读取(本地,数据查询等)
3)网络请求(同步)



三.IOS多线程实现种类

1)NSThread:一个轻量级的多线程,有两种创建方法,如下:

- (void)caculator

{

    int sum =0;

    @autoreleasepool {

        for (int i = 1; i <= 63550000; i++) {

            sum +=i;

            NSLog(@"sum =%d ",sum);

        }


    }

}

- (void)buttonAction:(id)sender

{

方法一:初始化一个子线程,需要手动开启

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

    [thread start];  开始子线程

    [thread release];


方法二:初始化一个子线程,自动开启    

  [NSThreaddetachNewThreadSelector:@selector(caculator)toTarget:self     withObject:nil];

}


2)NSObject

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


3)NSOperationNSOperationQueue(线程队列)

   Operation * mainAc =[[Operation alloc] init];

   Operation * second =[[Operation alloc] init];

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

    

    //设置最大并发数  最大并发数为1 线程与线程是同步的(一个一个走)

    [quene setMaxConcurrentOperationCount:1];//设为按顺序执行

    //添加两个子线程 两个子线程并发执行

    [quene addOperation:mainAc];

    [quene addOperation:second];

    

    [quene release];

    [mainAc release];

    [second release];


3) NSBlockOperation

    //block里面的内容就是多线程所要执行的代码

    NSBlockOperation * block =[NSBlockOperation blockOperationWithBlock:^{

        

        for (int i = 0; i < 10; i++) {

            NSLog(@"i= %d",i);

        }

        

    }];

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

    [quene addOperation:block];

    [quene release];

    


4) NSInvocationOperation

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

    

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

    [quene addOperation:invocation];

    [quene release];


5)GCD多线程

- (void)createSerialGCD

{

    //第一步:创建一个同步线程队列

    dispatch_queue_t queue =dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);

    //第二步:异步执行同步线程队列

    dispatch_async(queue, ^{

        //多线程的代码 不需要加自动释放池 因为是由C语言编写的

        //下载一张图片 并显示到界面上 下载用同步下载方式

        NSString * path =@"http://v.juhe.cn/movie/picurl?2583081";

        NSURL * url =[NSURL URLWithString:path];

        NSMutableURLRequest * request =[NSMutableURLRequest requestWithURL:url];

        [request setHTTPMethod:@"GET"];

        

        NSURLResponse * response =nil;

        NSError * error =nil;

        NSData * data =[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        UIImage *aimage=[UIImage imageWithData:data];

        

        //显示到界面上,所有跟UI相关的内容全部都要在主线程运行

        //返回主线程

        dispatch_barrier_async(dispatch_get_main_queue(), ^{

            //在主线程运行

            UIImageView * view =[[UIImageView alloc] initWithFrame:CGRectMake(156, 80, 200, 250)];

            view.image =aimage;

            [self.view addSubview:view];

            [view release];

        });

        

       

        

    });

    

  

}




- (void)createConcurrentGCD

{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        

    });

    

    NSURL * url =[NSURL URLWithString:@"http://ww4.sinaimg.cn/bmiddle/67dd74e0gw1enjmpsjr5tj20c30bk0tw.jpg"];

    NSData * data =[NSData dataWithContentsOfURL:url];

    UIImage *bimage =[UIImage imageWithData:data];

    

    //主线程 修改就改主线程

    dispatch_barrier_async(dispatch_get_main_queue(), ^{

        

        UIImageView * view =[[UIImageView alloc] initWithFrame:CGRectMake(150, 300, 200, 250)];

        view.image =bimage;

        [self.view addSubview:view];

        [view release];

        

    });

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值