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---");
