多线程在项目中的使用

简单概述,多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径,在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。
系统中每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则公用进程的内存空间。每创建一个新的进成,都需要一些内存(如每个线程有自己的stack空间)和消耗一定的CPU时间。当多个进成对同一个资源出现争夺的时候需要注意线程安全问题。
1.使用NSThread

    //创建方式主要有两种:

//一调用就会立即创建一个线程来做事情

    [NSThreaddetachNewThreadSelector:@selector(myThreadMainMethod:)toTarget:selfwithObject:nil];

//手动调用 start 启动线程时才会真正去创建线程

   NSThread* myThread = [[NSThreadalloc]initWithTarget:self

                                                 selector:@selector(myThreadMainMethod:)

                                                   object:nil];

    [myThread start];//启动线程



开启一个后台线程,执行 test 方法
  [self performSelectorInBackground:@selector(test) withObject:nil];

 //获取当前线程

    NSThread *current = [NSThreadcurrentThread];

//获取主线程

    NSThread *main = [NSThreadmainThread];


2,NSOperation:

//执行任务主函数,线程运行的入口函数


-(void)start


//是否允许并发,返回YES,允许并发,返回NO不允许。默认返回NO


-(BOOL)isConcurrent


- (BOOL)isExecuting


//是否已经完成,这个必须要重载,不然放在放在NSOperationQueue里的NSOpertaion不能正常释放。


- (BOOL)isFinished




比如TestNSOperation:NSOperaion重载上述的4个方法,


声明一个NSOperationQueue,NSOperationQueue *queue = [[[NSOperationQueue alloc ] init]autorelease];


[queue addOperation:testNSoperation];


它会自动调用TestNSOperation里的start函数,如果需要多个NSOperation,你需要设置queue的一些属性,如果多个NSOperation之间有依赖关系,也可以设置,具体可以参考API文档。




(2)非并发执行


-(void)main


只需要重载这个main方法就可以了。

3、 GCD

 //获取一个全局串行队列

    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

  //异步函数

    dispatch_async(queue, ^{

        NSLog(@"任务1所在的线程----%@",[NSThreadcurrentThread]);

    });

    

    //同步函数

    dispatch_sync(queue, ^{

        NSLog(@"任务2所在的线程----%@",[NSThreadcurrentThread]);

    });


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        

        //执行耗时的异步操作

        dispatch_async(dispatch_get_main_queue(), ^{

            

            //回到主线程,执行UI刷新操作

        });

    });


具体用法

    //1.获取一个全局串行队列

    dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    

    //2.把任务添加到队列中执行

    

    dispatch_async(queue, ^{

       

        //打印当前线程

        NSLog(@"currentThread --- %@",[NSThreadcurrentThread]);

        //3.从网络上下载图片

        NSURL *url = [NSURLURLWithString:@"http://h.hiphotos.baidu.com/baike/w%3D268/sign=30b3fb747b310a55c424d9f28f444387/1e30e924b899a9018b8d3ab11f950a7b0308f5f9.jpg"];

        NSData *data = [NSDatadataWithContentsOfURL:url];

        UIImage *image = [UIImageimageWithData:data];

        

        NSLog(@"图片加载完毕");

  /*

        //4.回主线程,展示图片

        [_imageV performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

   */

        dispatch_async(dispatch_get_main_queue(), ^{

           

            _imageV.image = image;

            //打印当前线程

             NSLog(@"currentThread --- %@",[NSThreadcurrentThread]);

        });

   

    });




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值