重点:
NSThread
多线程基础、pthread、开启线程的3种方式
线程的状态、线程安全问题、线程间的通信
GCD
同步方法和异步方法、队列的使用、线程间的通信
延迟执行、一次性代码、队列组、单例模式-ARC、单例模式-MRC、用宏抽取单例模式
NSOperation
NSOperation和NSOperationQueue的概念理解、NSInvocationOperation、NSBlockOperation
NSOperationQueue的常见方法、最大并发数、操作依赖、队列的取消\暂停\恢复
一、NSThread的基本使用
1、thread的演示
#import <pthread.h>
@interface ViewController ()
@end
@implementation ViewController
void *run(void *data){
for (int i=0; i<10000; i++) {
NSLog(@"%s,%@",__func__,[NSThread currentThread]);
}
return NULL;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
pthread_t *myrestrict;
NSLog(@"%s,%@",__func__,[NSThread currentThread]);
//创建线程
pthread_create(&myrestrict, NULL, run, NULL);
}
2、线程安全(了解)
NSThread线程的创建
#pragma mark - 创建线程
- (void) createThread1{
// 方式二:创建线程后自动启动线程
// [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];
// 方式三:隐式创建并启动线程
[self performSelectorInBackground:@selector(run:) withObject:@"http://10.9.10.116/tlxy/pages"];
// [self performSelector:@selector(run:) withObject:nil];s//直接调用方法。不会创建线程
/*
方式二、方式三的优缺点:
优点:简单快捷
缺点:无法对线程进行更详细的设置
*/
}
- (void) createThreadByinitWithTarget{
/*
线程的调度优先级(了解)
+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;
- (double)threadPriority;
- (BOOL)setThreadPriority:(double)p;
调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高
*/
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil];
[thread start];//Starts the receiver.进入就绪状态
[thread setName:@"lydia"];//设置线程名字
}
线程安全
/**
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会为setter方法加锁
1、 nonatomic和atomic对比
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,适合内存小的移动设备
2、iOS开发的建议
1)所有属性都声明为nonatomic
2)尽量避免多线程抢夺同一块资源
3)尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力
*/
@property (nonatomic,strong) NSThread *thread1;
/**
安全隐患解决 – 互斥锁
@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
1、互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
2、互斥锁的使用前提:多条线程抢夺同一块资源
ps:相关专业术语:线程同步
线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务)
互斥锁,就是使用了线程同步技术
*/
- (void)run{
while (1) {
@synchronized(self) {//加锁
int count = self.poll;
if (count>0) {
[NSThread sleepForTimeInterval:0.1];
self.poll--;
NSLog(@"%s---name:%@,poll = %d",__func__,[[NSThread currentThread] name],self.poll);
}else{
break;
}
}//解锁
}
}
3、线程间的通讯
作者:u011018979 发表于2017/7/4 15:20:32 原文链接
阅读:52 评论:0 查看评论