iOS开发中提供了四中多线程处理方案:pthread、NSThread、GCD和NSOperation
POSIX 表示可移植操作系统接口(Portable Operating System Interface) --pthread
Pthread是一套纯C的通用的多线程API,适用于Unix\Linux\Windows等系统,跨平台,可移植性强,但使用难度比较大,所以使用频率很低,这里不做过多介绍,主要以后三种多线程方案为主
pthread示例代码:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
/*
参数1:线程的编号(地址)
参数2:线程的属性
参数3:要调用的函数
void* (*) (void*)
int* 指向int类型的指针
void* 指向void类型的指针 id
参数4:给要调用的函数传递的参数
*/
pthread_t ID;
int result = pthread_create(&ID, NULL, demo, NULL);
//返回值为0代表成功,其他为失败
if (result == 0) {
NSLog(@"成功");
}else
{
NSLog(@"失败");
}
}
void* demo (void* param)
{
NSLog(@"demo %@",[NSThread currentThread]);
return NULL;
}
@end
接下来,先介绍一下NSThread,对比pthread,NSThread使用更加面向对象,简单易用,可直接操作线程对象,NSThread提供了三种多线程的使用方式:
首先创建一个方法(threadDemo:),在开启的新线程中来执行该方法的内部操作
方式一:
- (void)threadDemoMethod1{
NSString *parameter = @"我是传递给子线程的参数";
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo:) object:parameter];
[thread start];
}
- (void)threadDemo:(NSString *)parameter{
// LOG信息 --> 我是传递给子线程的参数,<NSThread: 0x7ffe1255cb80>{number = 2, name = (null)}
NSLog(@"%@,%@",parameter,[NSThread currentThread]);
}
方式二:
- (void)threadDemoMethod2{
NSString *parameter = @"我是传递给子线程的参数";
[NSThread detachNewThreadSelector:@selector(threadDemo:) toTarget:self withObject:parameter];
}
- (void)threadDemo:(NSString *)parameter{
// LOG信息 --> 我是传递给子线程的参数,<NSThread: 0x7ffe1255cb80>{number = 2, name = (null)}
NSLog(@"%@,%@",parameter,[NSThread currentThread]);
}
方式三:
- (void)viewDidLoad {
[super viewDidLoad];
// [self threadDemoMethod1];
// [self threadDemoMethod2];
[self performSelectorInBackground:@selector(threadDemo:) withObject:@"方式三"];
}
方式一相对于后两种方式可以获得一个NSThread对象
通过线程对象可以直接对线程的状态进行操作
线程的状态:
- 新建状态
- 就绪状态
- 运行状态
- 阻塞状态
- 死亡状态
NSThread的API中为我们提供了部分操作线程的方法
// 开启线程 --> 将线程添加到可调度线程池 变为就绪状态
- (void)start NS_AVAILABLE(10_5, 2_0);
// 停止线程 --> 线程进入死亡状态
+ (void)exit;
// 暂停(阻塞)线程 --> 线程进入阻塞状态
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;