zoukankan      html  css  js  c++  java
  • 多线程的实现

    NSThread

    方法一:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(test:) object:@"fuck"];
        [thread start];
    }
    - (void)test:(NSString *)string
    {
        for (int i = 0; i < 100; i ++) {
            
            NSLog(@"%@,%d",string,i);
        }
    }
    

     方法二:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //这种比较快速,不用调用start方法。
        [NSThread detachNewThreadSelector:@selector(test:) toTarget:self withObject:@"you"];
        
    }
    - (void)test:(NSString *)string
    {
        for (int i = 0; i < 100; i ++) {
            
            NSLog(@"%@,%d",string,i);
        }
    }
    

     方法三:使用较多

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //这个方法是从NSObject继承下来的,所有对象都可以通过这个方法快速创建一个线程去执行test中的方法。
        [self performSelectorInBackground:@selector(test:) withObject:@"哈哈"];
    }
    - (void)test:(NSString *)string
    {
        for (int i = 0; i < 100; i ++) {
            
            NSLog(@"%@,%d",string,i);
        }
    }
    

    NSThread常用方法:

        [NSThread isMainThread];//是否是主线程
        [NSThread isMultiThreaded];//是否是多线程(其他线程)
      [NSThread sleepForTimeInterval:2.0];//让当前线程睡眠2秒
      [NSThread exit];//退出当前线程

    NSOperationQueue(线程池)

    方式一:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view, typically from a nib.
        NSOperationQueue * optionQueue = [[NSOperationQueue alloc]init];//创建线程队列
      //创建一个线程 NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(fuckMan:) object:@"1"];
      //添加到线程池中,并执行 [optionQueue addOperation:operation];
    } - (void)fuckMan:(NSString *)str { NSLog(@"haha"); }

     方式二:

    //创建一个线程队列(线程池,存放很多条线程的池子)
    NSOperationQueue * optionQueue = [[NSOperationQueue alloc]init]; [optionQueue addOperationWithBlock:^{ for (int i = 0; i < 100; i ++) { NSLog(@"Thread 1 ----- %d",i); } }];//使用block的方式初始化一个线程对象,并让这个线程对象执行。

     主线程的使用:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view, typically from a nib.
        NSOperationQueue * optionQueue = [[NSOperationQueue alloc]init];
        NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(fuckMan:) object:@"1"];
        [optionQueue addOperation:operation];
        
        operation.queuePriority = NSOperationQueuePriorityVeryHigh;//设置线程的优先级为最高
        optionQueue.maxConcurrentOperationCount = 2;//设置线程池中最大有两个线程能处于运行状态
    }
    
    - (void)fuckMan:(NSString *)str
    {
        NSLog(@"haha");
        [NSThread isMainThread];//是否是主线程
        //用主线程执行
        [self performSelectorOnMainThread:@selector(mainThread) withObject:nil waitUntilDone:NO];
    }
    - (void)mainThread
    {
        if([NSThread isMainThread])
        {
            NSLog(@"我是一个主线程!");
        }
    }
    

    使用NSOperationQueue线程队列的好处:

    NSOperationQueue:    
    optionQueue.maxConcurrentOperationCount = 2;//设置线程池中最大有两个线程能处于运行状态
    NSOperation:
    operation.queuePriority = NSOperationQueuePriorityVeryHigh;//设置线程的优先级为最高
    

    GCD实现多线程(主流),使用这种方式可以提高代码的执行效率与多核的利用率。

     

    GCD的好处

    1.可以更好提高多核利用率

    2.block方式实现,简单快速。

    NSOperationQueue的好处

    1.可以控制线程最大数。

    2.可以控制线程的先后顺序。

    队列的规则是先进先出,只有前面的那个任务运行完了后面的才能继续运行。

    串行队列,它会保证队列的第一个任务执行完毕后才会执行第二个。

    串行队列中放入一个同步任务,它会按顺序执行队列中的任务,并且是有主线程执行,不会开启新的线程。

    串行队列中放入一个异步任务,它会按顺序执行队列中的任务,并且由新创建的一个线程来执行。(使用很多,因为需要创建一个新的线程来按顺序执行多个任务这种情况很常见)

    并行队列,是队列它必须符合先进先出的规则,但它的先进先出是让前面的几个任务按顺序拥有执行权限(并非按顺序执行),至于并行队列一次会让几个任务有执行权限是由队列自动管理的,分配了执行权限的那些任务的执行顺序是由操作系统来调度的。(只对放入的异步任务有效)

    并行队列中放入一个同步任务,在主线程中按顺序执行里面的所有任务。

    并行队列中放入多个异步任务,新开多线程分别对应执行多条任务。

  • 相关阅读:
    ios 写项目的时候遇到的问题及解决方案(1)
    思绪锦集
    iOS学习-----真机测试过程
    StackOverflow程序员推荐的几本书籍
    关于算法学习的重要性
    程序的灵魂-算法
    C++ 之 const 随笔记
    Foundation 框架之——NSString、NSMutableString
    Objective-C之NSString和NSMutableString
    Objective-C之集合对象(NSSet,NSMutableSet,NSIndexSet)
  • 原文地址:https://www.cnblogs.com/congliang/p/3775610.html
Copyright © 2011-2022 走看看