多线程的使用

注意概念:

  1. 主线程是其他线线程最终的父线程,所有界面的显示操作必须在主线程执行。

  2. 后台无法更新UI界面和用户点击事件

  3. 系统中每一个进程都有自己独立的虚拟内存空间,而同一进程中的多个线程则共用进程的内存空间

  4. 每创建一个新的线程,都会消耗一定的内存和CPU时间

  5. 当多个线程对同一个资源进行争夺的时候,需要注意线程安全问题

  6. 线程的使用不是无节制的,ios中主线程的堆栈大小是1兆,从第二个线程开始都是512

IOS中有三种多线程技术

  1. NSThread 每个NSThread对象对应一个线程,量级较轻

  2. NSOperation/NSOperationQueue面向对象的线程技术

  3. GCD---Grand Central Dispatch 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术。

这三种编程方式从上到下,抽象度从低到高,抽象度越高的使用越简单,。但是就目前而言,IOS的开发者,需要了解三种多线程技术的基本使用过程,因为很多框架技术分别使用了不同的多线程技术


//注意“在使用多线程时,线程里的任务要包在自动释放池里执行,否则容易出现内存泄露@autoreleasepool{   。。。。}


//若是方法btnAction有参数,则参数可以加在withObject后,

//performSelectorInBackground会创建一个后台线程,并在该线程中执行调用的方法

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

//指定某个线程刷新某个方法

[self performSelector:@selector(btnAction) onThread:thread withObject:nil......]

[self performSelectorOnMainThread:@selector(changeImage: ) withObject:image  waitUntilDone:YES];

//注意,waitUntilDone设置成yes,指要等这个操作执行完后才往下执行,NO为不必等操作完就往下执行。一般这里都设置成YES,否则多线程容易出问题


[NSThread currentThread]可以返回当前运行的线程

[NSThtead sleepForTimeInterval:1.0f];//线程睡眠,直适合在开发调试用,不适合写入应用程序

num = 1说明是主线程


GCD中,有三种方式队列,主队列,并行队列,串行队列,用同步异步方法去测试下面内容,会有更深刻的理解

1).在主队列中,同步与异步作用都是一样的,不会创建新的进程

    dispatch_queue_t queue = dispatch_get_main_queue();

    

    dispatch_async(queue, ^{

        NSLog(@"任务一:%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"任务二:%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"任务三:%@",[NSThread currentThread]);

    });

2).在串行队列中,异步不会创建新进程,顺序执行

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

    dispatch_async(queue, ^{

        NSLog(@"任务一:%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"任务二:%@",[NSThread currentThread]);

    });

    dispatch_async(queue, ^{

        NSLog(@"任务三:%@",[NSThread currentThread]);

    });

3).在并行队列中,创建进程


    //1.取全局队列

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //在队列中执行异步任务

    dispatch_async(queue, ^{

        NSLog(@"任务一:%@", [NSThread currentThread]);

    });

    

    dispatch_async(queue, ^{

        NSLog(@"任务二:%@",[NSThread currentThread]);

    });

    

    dispatch_async(queue, ^{

        NSLog(@"任务三:%@", [NSThread currentThread]);

    });


你可能感兴趣的:(线程,使用)