多线程的实现

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.可以控制线程的先后顺序。

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/congliang/p/3775610.html