iOS中的线程主要有四种:1.pThread 2.NSThread 3.GCD 4.NSOpreaction
基础知识:
线程、任务和队列的概念:
 
异步、同步 & 并行、串行的特点:

组合特点:

1.pThread
C语言所写,面向过程,使用较少.
oc:
#pragma Mark - pThread
- (void)pThreadDemo{
    pthread_t pthread;
    pthread_create(&pthread,NULL,run,NULL);
}
void *run(void *data){
    for (int i = 0; i < 10; i++) {
        NSLog(@"%d",i);
        sleep(1);
    }
    return NULL;
}  
Swift:
    //pThread
    func pThreadDemo() {
        var thread: pthread_t? = nil
        pthread_create(&thread, nil, { (_) -> UnsafeMutableRawPointer? in
            for var i in 0...10{
                print("\(i)")
                sleep(1)
            }
            return nil;
        }, nil)
        
    } 
2.NSThread
苹果封装后的,面向对象
NSThread有name,threadPriority两个属性,一个设置当前线程的名字,一个设置当前线程的优先级(0-1).
它有3种创建方式.其中第三种performSelector有很多方法:
在当前线程中执行一个方法:
[self performSelector:<#(SEL)#>];
在当前线程中执行一个方法并传参:
[self performSelector:<#(SEL)#> withObject:<#(id)#>];
在当前程中延迟几秒执行一个方法并传参:
[self performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#> ]
在主线程中执行一个方法并传参:
[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:<#(BOOL)#>];
在后台(子线程)中执行一个方法并传参:
[self performSelectorInBackground:<#(nonnull SEL)#> withObject:<#(nullable id)#>];
等等.下面代码会举例说明.
其中,线程锁也很常见,如卖票系统:
    @synchronized(self){
        ...
    }
或者
@property (nonatomic,strong) NSCondition * condition;
   [self.condition lock];
      ...
   [self.condition unlock];
OC:
#pragma Mark - NSThreadDemo
- (void)NSThreadDemo{
//    1.通过alloc init 创建
        NSThread * t1 = [[NSThread alloc]initWithTarget:self selector:@selector(nsThreadRun) object:nil];
        [t1 setName: @"我是名字"];    //为线程设置的名字
        [t1 setThreadPriority:0.5];   //设置优先级  0-1
        [t1 start];
//    2.通过detachNewThreadSelector
        [NSThread detachNewThreadSelector:@selector(nsThreadRun) toTarget:self withObject:nil];
        [NSThread detachNewThreadWithBlock:^{
            NSLog(@"%@",[NSThread currentThread].isMainThread == YES ? @"主线程" : @"子线程");
        }];
    
//    3.通过 performSelector
    [self performSelectorInBackground:@selector(nsThreadRun) withObject:nil];
    
}
-(void)nsThreadRun{
NSLog(@"%@",[NSThread currentThread].isMainThread == YES ? @"主线程" : @"子线程");
    for (int i = 0; i < 10; i++) {
        NSLog(@"%d",i);
        sleep(1);
    }
}
Swift:
    //NSThread
    func nsThreadDemo(){
        //1.通过init创建
        let thread:Thread = Thread.init(target: self, selector: #selector(nsThreadRun), object: nil)
        thread.name = "我是线程"
        thread.threadPriority = 0.4
        thread.start()
        
        //2.detachNewThreadSelector
       Thread.detachNewThreadSelector(#selector(nsThreadRun), toTarget: self, with: nil)
        Thread.detachNewThread {
            print("\(Thread.current.isMainThread)")
        }
        
        //3.performSelector
        self .performSelector(inBackground: #selector(nsThreadRun), with: nil)
        
    }
    @objc func nsThreadRun(){
        print("当前线程是:\(Thread.current.isMainThread ? "主":"子")")
        for var i in 0...10{
            print("\(i)")
            sleep(1)
        }
    }
3.GCD
使用最多,虽然也是C语言所写,但是加入了block,使用起来更加灵活.
OC:
(1):异步执行 + 并行队列
//创建一个并行队列
    dispatch_queue_t queue = dispatch_queue_create("标识符", DISPATCH_QUEUE_CONCURRENT);
    
    NSLog(@"---start---");
    
    //使用异步函数封装三个任务
    dispatch_async(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
    });
    
    NSLog(@"---end---");

(2):异步执行 + 串行队列
//创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("标识符", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"---start---");
    //使用异步函数封装三个任务
    dispatch_async(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
    });
    NSLog(@"---end---");

(3):同步执行 + 并行队列
//创建一个并行队列 dispatch_queue_t queue = dispatch_queue_create("标识符", DISPATCH_QUEUE_CONCURRENT);
    
    NSLog(@"---start---");
    //使用同步函数封装三个任务
    dispatch_sync(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
    });
    NSLog(@"---end---");

(4)同步执行+ 串行队列
    //创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("标识符", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"---start---");
    //使用异步函数封装三个任务
    dispatch_sync(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
    });
    NSLog(@"---end---");
  
(5)异步执行+主队列
    //获取主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    NSLog(@"---start---");
    //使用异步函数封装三个任务
    dispatch_async(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
    });
    NSLog(@"---end---");
  
(6)同步执行+主队列(死锁)
//获取主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    NSLog(@"---start---");
    //使用同步函数封装三个任务
    dispatch_sync(queue, ^{
        NSLog(@"任务1---%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"任务2---%@", [NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"任务3---%@", [NSThread currentThread]);
    });
    NSLog(@"---end---");
  
 
                    
                 
 
