iOS 关于线程的整理


//  Created by Blake on 14/7/3.
//  Copyright (c) 2014年 BLAKE. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //线程
    //NSThread
    //NSOperation和NSOperationQueue
    //GCD(Grand Center Dispatch)
    
    
//1.0 NSThread 线程的一般用法
    //创建子线程
    [NSThread detachNewThreadSelector:@selector(threadMethod) toTarget:self withObject:nil];
    
    
    //跳回主线程
    [self performSelectorOnMainThread:@selector(threadMethod) withObject:nil waitUntilDone:NO];
    
    
    //创建子线程
    NSThread* thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadMethod) object:nil];
    thread.name = @"x";//线程的名字
    [thread start];//开始线程
    [thread cancel];//取消线程 -> thread.isCancelled = YES;
    
    
    [thread threadPriority];//获取正在执行的线程优先级
    [thread setThreadPriority:1.0];//设置优先级范围0~1   1最高级
    [NSThread threadPriority];//获取正在执行的线程优先级
    [NSThread setThreadPriority:0.1];//设置优先级范围0~1   1最高级

    
    [NSThread sleepForTimeInterval:1];//线程睡眠时间
    [NSThread sleepUntilDate:[NSDate date]];//线程睡眠到date
    
    
    [NSThread currentThread];//获取当前线程
    [NSThread isMainThread];//是否主线程
    [NSThread isMultiThreaded];//是否多线程
    [NSThread exit];//终止线程
//1.1 线程的安全
    //经典问题,银行取钱问题,多线程同时操作,出现问题
 //解决(1)
    //同步代码块,确保块中的代码 ,只被单一线程执行
    @synchronized(self){ //self代表同步的监视器
    //同步代码块
    }
    
 //解决(2)
    //NSLock线程锁
    NSLock* lock;
    [lock lock];//进门上锁
    
    //多线程操作的代码
    //确保一次只能进入一个人
    
    [lock unlock];//出门解锁

 //解决(3)
    //NSCondition
    //实现了NSLocking 协议  可以调用lock unlock 来同步 ,
    NSCondition* condition;
    
    [condition wait];//使当前线程一直处于等待状态 知道其他线程调用signal或broadcast方法来唤醒
    [condition waitUntilDate:[NSDate date]];//控制线程到指定时间
    
    [condition signal];//唤醒等待的单个线程(多个 随机)
    [condition broadcast];//唤醒所有线程
    
    
//2.0 GCD实现多线程
    //1.创建队列(串行队列,并发队列)
    //(1.1)串行队列:串行,只有一个线程,从头到尾执行
    //(1.1)并发队列:多个线程来执行,按FIFO(first in first out//先进先出) 的顺序并发启动,执行多个并发任务
    //2.将任务提交给队列
    
  //2.1 创建队列
    //获取全局的并发队列
    dispatch_queue_t globalQueue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//第一个参数代表优先级 //第二个参数没发现作用
    
    //获取主线程串行队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    //创建串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("Que", DISPATCH_QUEUE_SERIAL);
    
    //创建并发队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("Que", DISPATCH_QUEUE_CONCURRENT);
    
    
    
  //2.2异步提交任务
    //串行队列 挨个执行  先执行代码1 后2
    dispatch_async(serialQueue, ^{
        
            //代码1
        
    });
    dispatch_async(serialQueue, ^{
        
        //代码2
        
    });
  
    //并行队列 两个代码块可以并发执行
    dispatch_async(concurrentQueue, ^{
        //代码1
    });
    dispatch_async(concurrentQueue, ^{
        //代码2
        
    });
    
    //获取全局的并发队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        //子线程代码
        
        //主线程代码
       dispatch_async(dispatch_get_main_queue(), ^{
           
       });
        
    });
    
    
  //2.3同步提交任务
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //同步方式 只按照顺序执行,
    });
    
  //2.4多次执行的任务
    dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t time) {
        //time 表示当前正在执行 第几次
    });
    
  //2.5只执行一次的任务
    static id obj = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //在整个应用生命周期中,只创建一次
        //可以用在单例类中,确保线程安全;
        obj = [[NSObject alloc]init];
        
    });
    
//3.0 使用NSOperation和NSOperationQueue实现多线程
    //(1)创建NSOperationQueue队列,设置相关属性
    //(2)创建NSOperation子类(或NSInvocationOperation,NSBlockOperation) 对象, 并提交给NSOperationQueue队列,
    
    //一般不直接使用NSOperation,而是创建他的子类 然后重写-(void)main;方法
    
    
    [NSOperationQueue currentQueue];//当前执行的队列
    [NSOperationQueue mainQueue];//住线程队列
    NSOperationQueue* queue = [[NSOperationQueue alloc]init];
    
//    [queue addOperation:(NSOperation *)];
//    [queue addOperations:(NSArray *) waitUntilFinished:(BOOL)];YES同步执行 NO异步执行
    [queue operations];//(readonly)返回所有NSOperation对象
    
    [queue operationCount];//(readonly)返回NSOperation对象的数量
    
    [queue cancelAllOperations];//取消队列中的所有NSOperation
    
    [queue waitUntilAllOperationsAreFinished];//阻塞当前线程,直到队列中所有operation执行完成
    
    [queue maxConcurrentOperationCount];//队列最大的支持并发数
    
    [queue setMaxConcurrentOperationCount:5];//设置队列的最大并发数
    
    [queue setSuspended:YES];//暂停正在排队的operation
    
    [queue isSuspended];//是否已暂停正在排队的operation
    
    //创建线程队列
    NSOperationQueue* que = [[NSOperationQueue alloc]init];
    
    //AsyMethod异步执行的代码
    NSInvocationOperation* invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(AsyMethod) object:nil];
    
    [que addOperation:invocation];//添加到队列中
    
    NSBlockOperation* block = [NSBlockOperation blockOperationWithBlock:^{
            //Asy异步执行的代码
    }];
    
    [que  addOperation:block];//添加到队列中
    
    
	// Do any additional setup after loading the view, typically from a nib.
}

今天不怎么忙,总结整理了一些关于线程的用法,自己加深理解,也方便有需要的其他人,如果有错误,请批评指正.谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值