码迷,mamicode.com
首页 > 编程语言 > 详细

多线程编程

时间:2015-02-16 12:58:19      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

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

进程:一个运行的程序可以看成一个进程,进程拥有独立运行的全部资源.

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

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

每一个正在运行的程序,至少包涵一个线程,这个线程叫主线程.只有一个主线程的程序称为单线程程序.代码顺序执行,容易出现代码阻塞.为了避免出现代码阻塞,我们有时需要自己开辟新的线程,提高程序的运行性能.

NSThread是一个轻量级的多线程.

初始化NSThread有两个方式;

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(action:) object:@"hello,world"];//子线程执行的方法和所需的参数.不需要参数就给nil;

    //开启多线程

    [thread start]; //实例方法,但需要手动开启.

第二个类方法

 // 使用系统的

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

NSOperation在MVC中属于M,是用来封装单个任务相关的代码和数据的抽象类,不能直接使用这个类,而是用其子类来执行实际任务.如NSInvocationOperation,NSBlockOperation.

代码如下:

    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(action:) object:@"hello,world"];

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

    

    

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

        

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

            NSLog(@"%d", i);

        }

    }];

    //队列来管理一个或多个任务

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

    //绑定一个任务,就是前者必须等后者执行完

    [operation addDependency:blockOperation];

    //[queue setMaxConcurrentOperationCount:2];

    //将任务加到队列中

    [queue addOperation:operation];

    [queue addOperation:operation1];

    [queue addOperation:blockOperation];

    

    //[queue addOperations:[NSArray arrayWithObjects:blockOperation,operation1, nil] waitUntilFinished:YES];

 

GCD是苹果公司开发的技术,以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.GCD属于函数级的多线程,性能更高,功能更强大.

关于gcd有两种队列,serialQueue.一次只执行一个任务 ;

#pragma mark -- gcd之串行 serial

    //串行特点 一个一个执行, 一个执行完再执行下一个

    //1.系统自带串行队列

    //创建系统主列队

#warning 重点,经常用到,作用:从子线程上得到主线程

   // dispatch_queue_t mainQueue = dispatch_get_main_queue();

    //1.2执行主队列

//    dispatch_async(mainQueue, ^{

//        

//        NSLog(@"hello,world");

//        NSLog(@"1= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

//    });

//    dispatch_async(dispatch_get_main_queue(), ^{

//        

//        NSLog(@"获得主线程的大众写法");

//    });

    //2.自定义串行队列

    //创建自定义串行队列

    //参数1.队列标示符 一般是逆向域名

    //参数2.队列类型

    //dispatch_queue_t mySerialQueue = dispatch_queue_create("com.myself.GCD.serial", DISPATCH_QUEUE_SERIAL);

    //2.2执行队列

//    dispatch_async(mySerialQueue, ^{

//        

//         NSLog(@"1= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

//         NSLog(@"2= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

//         NSLog(@"3= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

//         NSLog(@"4= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

//    });

 

 concurrent,可以并发的执行多个任务,但遵循FIFO

    //自定义并行队列

    //创建自定义并行队列

    //dispatch_queue_t myConcurrentQueue = dispatch_queue_create("com.myself.GCD.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

   /* dispatch_async(myConcurrentQueue, ^{

        

                         NSLog(@"1= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

                         NSLog(@"2= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

                         NSLog(@"3= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

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

                    NSLog(@"%d", i);

                }

                         NSLog(@"4= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

                         NSLog(@"5= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

                         NSLog(@"6= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

        

                        NSLog(@"7= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

        

       

    });*/

//    dispatch_async(myConcurrentQueue, ^{

//        

//        for (int i = 0; i < 10000; i++) {

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

//        }

//

//    });

 

接下来是GCD的一些其他方法

//    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

//        

//                    NSLog(@"7= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

//    });//延迟多少秒执行

    

    

    //只能执行一次

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        NSLog(@"7= %@, %d", [NSThread currentThread], [NSThread isMainThread]);

    });

  

 

多线程编程

标签:

原文地址:http://www.cnblogs.com/myselfxiaoxiao/p/4293916.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!