多线程和GCD的使用

1.NSThread的使用

方式一:开启多线程,并且执行方法threadAction

[self performSelectorInBackGround:@selector(threadAction) withObject:nil];

方式二:

NSThread *thread =[[NSThread alloc]initWithTarget:self  selector:@selector(threadAction:) object:@"text"]
thread.name = @"thread1";
//开启线程
[thread start];

方式三:开启新的线程,并且执行

[NSThread decathNewThreadSelector:@selector(threadAction) toTarget:self withObject:@"哈哈"];

- (void)threadAction:(NSString *)str {
   //1.获取当前线程对象
    NSThread *thread = [NSThread currentThread];
    NSLog(@"thread:%@",thread);
    
    //2.判断当前是否是在多线程
    if ([NSThread isMultiThreaded]) {
        NSLog(@"当前是否是多线程");
    }
    
    for (int i=0; i<50; i++) {
        NSLog(@"thread:%d",i);
        
        if (i == 10) {
            //让当前线程睡眠3秒
//            [NSThread sleepForTimeInterval:3];
            
            //退出当前线程
//            [NSThread exit];
        }
        
    }    
    //回到主线程
//   [self performSelectorOnMainThread:<#(SEL)#> withObject:<#(id)#> waitUntilDone:<#(BOOL)#>]
}

2.NSOperationQueue的使用

//创建线程队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//关闭暂停队列
[queue setSuspend: YES];
//设置最大并发数
queue.maxConcurrentOperationCount = 1;

//创建线程
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(thread1:) object:@"op1"];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(thread1:) object:@"op2"];

//设置线程的优先级
operation1.queuePriority = NSOperationQueuePriorityNormal;
operation1.queuePriority = NSOperationQueuePriorityHigh;
//将线程添加到队列中
[queue addOperation:operation1];
[queue addOperation:operation2];

//直接用block
[queue addOperationWithBlock:^{

@autoreleasepool {
   for (int i = 0; i < 50; i ++)
       {
          NSLog(@"op3:%d",i);

       }

   }
}];

//开始队列
[queue setSuspended:NO];

- (void)thread1:(NSString *)threadName {

    @autoreleasepool {
        for (int i=0; i<50; i++) {
            NSLog(@"thread1:%d",i);
        }
        
    }
    
}

- (void)thread2:(NSString *)threadName {
    
    @autoreleasepool {
        
        for (int i=0; i<50; i++) {
            NSLog(@"thread2:%d",i);
        }
        
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction) userInfo:nil repeats:YES];
        
        //如果设置定时器,必须设置runLoop,线程二则不会关闭;
//        [[NSRunLoop currentRunLoop] run];
        
    }
    
}

- (void)timeAction {

    NSLog(@"timeAction");
    
}

3.GCD的使用

一:队列

  • 串行队列:添加到队列中的任务是一个一个执行的
  • 并行(发)队列:添加到队列中的任务是多个同时执行的
  • 主队列:里面的任务都是在主线程执行的,可以理解为主队列就是串行队列的一种
  • 全局队列:并行(发)队列

二:同步、异步

  • 同步:需要后面的任务等待,不会开启新的线程,会直接使用当前的线程
  • 异步:不需要后面的任务等待,会开启新的线程

1.创建并发队列

优先级:

DISPATCH_QUEUE_PRIORITY_HIGH

DISPATCH_QUEUE_PRIORITY_DEFAULT

DISPATCH_QUEUE_PRIORITY_LOW

DISPATCH_QUEUE_PRIORITY_BACKGROUND

    //1.创建并行队列
  //    dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
    
    //2.获取全局队列(并行队列)
       dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

1.1向并发队列中添加任务

<1>异步添加任务

    dispatch_async(queue2, ^{
        @autoreleasepool {
            
            for (int i=0; i<50; i++) {
                NSLog(@"1....i:%d",i);
            }
        }
    });
    
    for (int i=0; i<50; i++) {
        NSLog(@"??....i:%d",i);
    }
    
    dispatch_async(queue2, ^{
            
            for (int i=0; i<50; i++) {
                NSLog(@"2....i:%d",i);
            }
    });

<2>同步添加任务

    dispatch_sync(queue2, ^{
        
        for (int i=0; i<50; i++) {
            NSLog(@"??....i:%d",i);
        }
    });
    
    for (int i=0; i<50; i++) {
        NSLog(@"??....i:%d",i);
    }
    
    dispatch_sync(queue2, ^{
        for (int i=0; i<50; i++) {
            NSLog(@"??....i:%d",i);
        }
    });

2.创建串行队列

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

1.1向串行队列中添加任务

<1>异步添加

    dispatch_async(queue, ^{
        for (int i=0; i<50; i++) {
            NSLog(@"??....i:%d",i);
        }
    });
    
    dispatch_async(queue, ^{
        for (int i=0; i<50; i++) {
            NSLog(@"??....i:%d",i);
        }
    });
    
    for (int i=0; i<100; i++) {
        NSLog(@"??...--------.i:%d",i);
    }

<2>同步添加任务

    dispatch_sync(queue, ^{
        for (int i=0; i<50; i++) {
            NSLog(@"??....i:%d",i);
        }
    });
    
    dispatch_sync(queue, ^{
        for (int i=0; i<50; i++) {
            NSLog(@"??....i:%d",i);
        }
    });
    
    for (int i=0; i<100; i++) {
        NSLog(@"??...--------.i:%d",i);
    }

3.创建主队列(在使用主队列的时候,绝对不可以在主队列中同步添加任务)

    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    
    //向刚才创建的并发队列中异步添加一个网络加载的任务,加载完成后,回到主线程操作UI
    dispatch_async(queue2, ^{
        NSLog(@"网络加载");
        
        //完成了
        dispatch_async(mainQueue, ^{
            NSLog(@"操作UI");
        });
        
        
    });
时间: 2024-08-30 16:50:31

多线程和GCD的使用的相关文章

多线程开发----GCD

多线程之-GCD Grand Centeral Dispatch(宏大的中枢调度器) GCD中有2个核心概念 任务:执行什么操作 队列:用来存放任务 遵循FIFO(先进先出)原则 执行任务 同步方法: dispatch_sync 异步方法: dispatch_async 同步和异步的区别 同步:只能在当前线程中执行任务,不具备开启新线程的能力 异步:可以在新的线程中执行任务,具备开启新线程的能力 队列 并发队列 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务) 并发功能只有在异步(

iOS开发多线程篇—GCD的基本使用

iOS开发多线程篇—GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: dispatch_queue_t queue=dispatch_get_main_queue(); (1)使用异步函数执行主队列中得任务,代码示例: 1 // 2 // YYViewController.m 3 //

iOS开发多线程篇—GCD介绍

iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中

iOS中的多线程及GCD

多线程中的一些概念 //任务:代码段  方法  线程就是执行这些任务 //NSThread类 创建线程 执行线程 [NSThread isMainThread]//判断是否是主线程 #import "AppDelegate.h" @implementation AppDelegate -(void)dealloc { [_window release]; [super dealloc]; } - (BOOL)application:(UIApplication *)applicatio

IOS网络多线程-GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

iOS开发多线程篇—GCD的常见用法

iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispat

iOS多线程技术—GCD介绍

iOS多线程技术—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,

多线程二(GCD)代码笔记

// // TWFXViewController.h // Demo_GCD // // Created by Lion User on 12-12-11. // Copyright (c) 2012年 Lion User. All rights reserved. // #import <UIKit/UIKit.h> @interface TWFXViewController : UIViewController @property (retain, nonatomic) IBOutlet

iOS开发多线程篇—GCD介绍 - 文顶顶

原文  http://www.cnblogs.com/wendingding/p/3806821.html iOS开发多线程篇-GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行

关于多线程和GCD新手教程(二)

原文链接:http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial 接上文:关于多线程和GCD新手教程(一) 一个简单的方式就是从你的代码中的一部分刷新另外一部分代码,这是苹果内置的NSNotification消息系统.它的确很简单.你可以通过[NSNotificationCenter defaultCenter]取得NSNotificatio