IOS多线程

NSThread   线程类


#pragma mark - snippet 代码段

-(void)snippet

{

    // NSThread   线程类

    NSThread *current = [NSThread currentThread];

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

    

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

    BOOL result = [NSThread isMainThread];

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

    

    // 获取主线程

    NSThread *mainThread = [NSThread mainThread];

    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: %@",[NSThread currentThread]);

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

    

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

    //即一个子线程中

    

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

}


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

- (IBAction)sender2:(id)sender

{

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

    

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

    

    // 设置线程名字

    thread1.name = @"aaaa";

    //开始

    [thread1 start];

    [thread1 release];

    

    //sender2 方法2

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

}


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

- (IBAction)NSOperation:(id)sender

{

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

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

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

    

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

    

    MyOperation *op1 = [[MyOperation alloc] init];

    

    MyOperation *op2 = [[MyOperation alloc] init];

    

    MyOperation *op3 = [[MyOperation alloc] init];

    

    [op1 start];

    [op2 start];

    [op3 start];

    

    // 2 系统推荐的子类

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

    [invocation start];

    

    NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

        [self snippet];

    }];

    [blockOperation start];

}


#pragma mark  ** NSOperationQueue实现多线程

- (IBAction)NSOperationQueue:(id)sender

{

    // NSOperationQueue   任务队列

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

    

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

    //设置最大并发数

    queue.maxConcurrentOperationCount = 2;

    

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

    MyOperation *op1 = [[MyOperation alloc] init];

    MyOperation *op2 = [[MyOperation alloc] init];

    MyOperation *op3 = [[MyOperation alloc] init];

    MyOperation *op4 = [[MyOperation alloc] init];

    

    [queue addOperation:op1];

    [queue addOperation:op2];

    [queue addOperation:op3];

    [queue addOperation:op4];

    

    [queue addOperationWithBlock:^{

        [self snippet];

    }];

    [queue addOperationWithBlock:^{

        [self snippet];

    }];

}


#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 = [NSURL URLWithString:str];

        

        NSData *data = [NSData dataWithContentsOfURL:url];

        

        UIImage *image = [UIImage imageWithData:data];

        

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

        

        dispatch_async(dispatch_get_main_queue(), ^{

            

            self.imageview.image = image;

            

        });

        

    });


    

    

}


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

+(instancetype)shareViewController

{

    static ViewController *vc = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        vc = [[ViewController alloc] init];

    });

    return vc;

}



- (void)dealloc {

    [_imageview release];

    [super dealloc];

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值