IOS多线程

来源:互联网 发布:2选一数据选择器 编辑:程序博客网 时间:2024/06/17 16:47

NSThread  线程类


#pragma mark - snippet代码段

-(void)snippet

{

    // NSThread  线程类

    NSThread *current = [NSThreadcurrentThread];

    NSLog(@"snippet's thread : %@",current);

    

    //判断当前的线程是否为主线程

    BOOL result = [NSThreadisMainThread];

    NSLog(@"snippet is mainThread ? : %d",result);

    

    //获取主线程

    NSThread *mainThread = [NSThreadmainThread];

    NSLog(@"当前的主线程:%@",mainThread);

    

    //让线程延迟几秒 在运行

    [NSThread sleepForTimeInterval:3];

    

    

     long a =0;

    for (long i=0 ; i <10000000; i++) {

        a+=i;

    }

    NSLog(@"a = %ld",a);

}


#pragma mark - 知识点1 多线程方法1:NSObject方法

- (IBAction)sender:(id)sender

{

    NSLog(@"NSObject Thread: %@",[NSThreadcurrentThread]);

    NSLog(@"NSObject isMainThread ? :%d",[NSThreadisMainThread]);

    

    //使用NSObject方法,将执行的代码放在后台线程运行

    //即一个子线程中

    

    [selfperformSelectorInBackground:@selector(snippet)withObject:nil];

}


#pragma mark - 知识点2 多线程方法2

- (IBAction)sender2:(id)sender

{

    // NSThread线程类 一个对象相当于一个线程

    

    NSThread *thread1 = [[NSThreadalloc] initWithTarget:selfselector:@selector(snippet)object:nil];

    

    //设置线程名字

    thread1.name =@"aaaa";

    //开始

    [thread1 start];

    [thread1 release];

    

    //sender2方法2

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

}


#pragma mark - 知识点3 多线程方法3

- (IBAction)NSOperation:(id)sender

{

    // NSOperation类, 它是一个基类,不能直接创建对象,用它的子类创建对象,用它的子类和系统推荐的两个类 创建对象

    //它的子类对象,相当于一个任务(要执行的代码段)

    //它的原理:将任务放入当前线程中执行

    

    // 1自定义一个NSOperation 子类:MyOperation

    

    MyOperation *op1 = [[MyOperationalloc] init];

    

    MyOperation *op2 = [[MyOperationalloc] init];

    

    MyOperation *op3 = [[MyOperationalloc] init];

    

    [op1 start];

    [op2 start];

    [op3 start];

    

    // 2系统推荐的子类

    NSInvocationOperation *invocation = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(snippet)object:nil];

    [invocation start];

    

    NSBlockOperation *blockOperation = [NSBlockOperationblockOperationWithBlock:^{

        [selfsnippet];

    }];

    [blockOperation start];

}


#pragma mark  ** NSOperationQueue实现多线程

- (IBAction)NSOperationQueue:(id)sender

{

    // NSOperationQueue  任务队列

    //原理:有个 线程池 负责把任务分配给线程,当线程执行完之后,回到线程池,等待下次新任务

    

    NSOperationQueue *queue = [[NSOperationQueuealloc] init];

    //设置最大并发数

    queue.maxConcurrentOperationCount =2;

    

    //队列中添加Operation(任务)

    MyOperation *op1 = [[MyOperationalloc] init];

    MyOperation *op2 = [[MyOperationalloc] init];

    MyOperation *op3 = [[MyOperationalloc] init];

    MyOperation *op4 = [[MyOperationalloc] init];

    

    [queue addOperation:op1];

    [queue addOperation:op2];

    [queue addOperation:op3];

    [queue addOperation:op4];

    

    [queue addOperationWithBlock:^{

        [selfsnippet];

    }];

    [queue addOperationWithBlock:^{

        [selfsnippet];

    }];

}


#pragma mark - 重点

#pragma mark - 知识点4 多线程方法4 GCD

- (IBAction)GCD:(id)sender

{

    // GCD:大调度中心

    //函数级别,效率高,推荐使用

    //原理:有一个队列,队列中是代码段任务(任务的创建使用block或者函数)

    //队列,可以自定义队列,也可以使用系统队列。

    

#if 0//自定义创建队列

    

    

    // 1创建一个串行调度队列, 串行即:任务一个一个执行

    dispatch_queue_t myQueue = dispatch_queue_create("com.myQueue.www", DISPATCH_QUEUE_SERIAL);

    

    // 2调用队列中添加任务

    dispatch_async(myQueue, ^{

        [self snippet];

    });

    

    dispatch_async(myQueue, ^{

        [self snippet];

    });

    

    dispatch_async(myQueue, ^{

        [self snippet];

    });

    

#endif

    

#if 0//创建自定义并发调度队列

    

    dispatch_queue_t myConQueue = dispatch_queue_create("com.myConQuene", DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_async(myConQueue, ^{

        [self snippet];

    });

    dispatch_async(myConQueue, ^{

        [self snippet];

    });

    dispatch_async(myConQueue, ^{

        [self snippet];

    });

    dispatch_async(myConQueue, ^{

        [self snippet];

    });

    dispatch_async(myConQueue, ^{

        [self snippet];

    });

    

    

    

    

#endif

    

    

#pragma mark ** 系统队列

#if 0// 系统队列

    

    //系统有一个串行队列:main  即主线程

    //4个并发队列

    

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    

    //向调度队列添加任务

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

    

#endif

    

    

#if 0

    

    //体统的并发队列

    dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    

    //调度队列添加任务

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

    dispatch_async(mainQueue, ^{

        [self snippet];

    });

#endif

    

    

#pragma mark ** 重点 GCD使用

    //子线程负责 数据的加载

    //主线程负责 刷新等操作

    

    dispatch_queue_t global =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

    

    dispatch_async(global, ^{

        

        NSString *str =@"http://e.hiphotos.baidu.com/image/pic/item/42a98226cffc1e1786934a384890f603738de98f.jpg";

        NSURL *url = [NSURLURLWithString:str];

        

        NSData *data = [NSDatadataWithContentsOfURL:url];

        

        UIImage *image = [UIImageimageWithData:data];

        

        /*回到主线程队列,添加任务(刷新任务) */

        

        dispatch_async(dispatch_get_main_queue(), ^{

            

            self.imageview.image = image;

            

        });

        

    });


    

    

}


#pragma mark - 知识点5 重点 GCD创建单例

+(instancetype)shareViewController

{

    staticViewController *vc = nil;

    staticdispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        vc = [[ViewControlleralloc] init];

    });

    return vc;

}



- (void)dealloc {

    [_imageviewrelease];

    [superdealloc];

}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 瑜伽按摩球破了怎么办 孕妇吐完胸口疼怎么办 孕25周胸口堵怎么办呢 孕期没做过产检怎么办 宝宝的泪囊堵塞怎么办 瑜伽球塞子丢了怎么办 瑜伽球塞子没了怎么办 练阴瑜伽是想睡怎么办 肠道引流拨断了怎么办 瑜伽动作做不到位怎么办 胃肠吸收不好一直长不胖怎么办 小孩把泡泡糖吞进肚子怎么办 练习瑜伽又?带硬怎么办 天气太热没有空调怎么办 腹股沟岔气怎么办才能快点好 瑜伽馆不给退卡怎么办 膝盖总是凉凉的怎么办 练阴瑜伽腿麻怎么办 瑜伽垫在地板滑怎么办 艾灸后后背发凉怎么办 床上老是有小蜈蚣怎么办 早晚出去胳膊脚觉得凉怎么办 腿凉感觉冒凉气怎么办 冬天腿被冻夏天发酸发凉怎么办 宿舍一楼虫子多怎么办 有虫子在咬床板怎么办 床板上的虫咬了怎么办 住的房间有臭虫怎么办 租的房子有臭虫怎么办 瑜伽垫放地上脏怎么办 瑜伽垫和地面滑怎么办 练瑜伽时瑜伽垫全是汗水怎么办 车钥匙放洗衣机洗了怎么办 瑜伽垫边上掉渣怎么办 晚上睡地上后背不舒服怎么办 小孩子天天晚上看电视不睡觉怎么办 宝宝天天晚上不睡觉怎么办 老公天天晚上不睡觉怎么办 小孩天天晚上不睡觉怎么办 摸了貔貅的眼睛怎么办 买的爬行垫滑怎么办