多线程之-NSThread

进程和线程概念

1,进程:进程是计算机系统分配的单位,每个进程之间是相互独立的,如同时打开微信,QQ,那么就开启了2个进程;
2,线程:线程是进程的基本执行单位,进程中所有的任务都是在线程中执行的,每一个进程都必须存在并且只有一个主线程,允许存在多个子线程;
3,多线程:在不阻塞主线程情况下,充分利用CPU资源开启多个线程去执行耗时任务,优化app体验;

NSThread使用

异步,并发队列
需要对线程进行手动管理
较少用到

创建

第一种是类方法:

1
2
3
4
[NSThread detachNewThreadSelector:@selector(action4) toTarget:self withObject:@"123"];  
-(void)action4{

}

该类方法创建的线程会自动启动,@”123”是线程的标识符;

iOS10之后提供了一种Block方法:

1
2
3
4
[NSThread detachNewThreadWithBlock:^{  
//iOS10之后的block方法
NSLog(@"NSThread1=%@",[NSThread currentThread]);
}];

第二种是init方法:

1
2
3
4
5
6
 NSThread *t1 = [[NSThread alloc]initWithTarget:self selector:@selector(action1) object:nil];  
t1.name = @"1";
[t1 start];
-(void)action1{

}

需要手动去开启,name=@“1”是线程的标识符;

NSThread一些方法和属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//是否是多线程
[NSThread isMultiThreaded];
//是否是主线程
[NSThread isMainThread];
//获取当前线程,number=1表示是主线程
[NSThread currentThread];
//休眠多久
[NSThread sleepForTimeInterval:1.2];
//休眠到什么时间
[NSThread sleepUntilDate:[NSDate date]];
//退出线程
[NSThread exit];
//当前线程优先级
[NSThread threadPriority];
//设置线程的优先级0.0~1.0,默认0.5,数值越大,表示cpu调用的频率高
[NSThread setThreadPriority:0.2];
//主线程对象
NSThread *main = [NSThread mainThread];

NSThread *t3 = [[NSThread alloc]initWithBlock:^{
//iOS10新增加方法
}];
[t3 start];
//name,线程标识
t3.name = @"name1";
if (t3.isExecuting) {
//是否在执行
}
if (t3.isCancelled) {
//是否停止
}
if (t3.isFinished) {
//是否完成
}
if (t3.isMainThread) {
//是否是主线程
}

线程同步

线程同步,指的是不同的线程同时去争夺同一块资源,造成的数据混乱和数据安全的问题;就好比几个人修改同一个表的时候造成的数据混乱;

解决方案1:@synchronized
1
2
3
@synchronized(self) {
    // 需要锁定的代码
}
解决方案2:NSLock
1
2
3
4
全局变量:NSLock *lock = [[NSLock alloc]init];
[lock lock];
//需要锁定的代码
[lock unlock];

互斥锁和自旋锁

互斥锁

上面的方案1和方案2都属于互斥锁:加了互斥锁的代码,当新线程访问时,如果发现其他线程正在执行锁定的代码,新线程就会进入休眠.

自旋锁

另外还有一种叫自旋锁:加了自旋锁,当新线程访问代码时,如果发现有其他线程正在锁定代码,新线程会用死循环的方式,一直等待锁定的代码执行完成。相当于不停尝试执行代码,比较消耗性能。
属性修饰atomic本身就有一把自旋锁。

1
2
3
4
nonatomic 非原子属性,同一时间可以有很多线程读和写
atomic 原子属性(线程安全),保证同一时间只有一个线程能够写入(但是同一个时间多个线程都可以取值),atomic 本身就有一把锁(自旋锁)
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,不过效率更高,一般使用nonatomic