系列文章:
Pthreads
这是一套在很多操作系统上都通用的多线程API, 基于 c语言 的框架
#import <pthread.h>
// 创建线程,并执行任务
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
pthread_t thread;
//创建一个线程并自动执行
pthread_create(&thread, NULL, start, NULL);
}
void *start(void *data) {
NSLog(@"%@", [NSThread currentThread]);
return NULL;
}
复制代码
打印输出
2015-07-27 23:57:21.689 testThread[10616:2644653] <NSThread: 0x7fbb48d33690>{number = 2, name = (null)}
复制代码
你需要手动处理线程的各个状态的转换即管理生命周期,比如,这段代码虽然创建了一个线程,但并没有销毁。
NSThread
这套方案是经过苹果封装后的,并且完全面向对象的。所以你可以直接操控线程对象,非常直观和方便。但是,它的生命周期还是需要我们手动管理,所以这套方案也是偶尔用用,比如 [NSThread currentThread]
,它可以获取当前线程类,你就可以知道当前线程的各种属性,用于调试十分方便。下面来看看它的一些用法。
创建并启动
- 先创建线程类,再启动
OBJECTIVE-C
// 创建
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:nil];
// 启动 线程一启动,就会在线程thread中执行self的run方法
[thread start];
复制代码
SWIFT
//创建
let thread = NSThread(target: self, selector: "run:", object: nil)
//启动
thread.start()
复制代码
- 创建并自动启动线程
OBJECTIVE-C
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:nil];
复制代码
SWIFT
NSThread.detachNewThreadSelector("run:", toTarget: self, withObject: nil)
复制代码
- 使用 NSObject 的方法创建(隐式创建)并自动启动线程
OBJECTIVE-C
[self performSelectorInBackground:@selector(run:) withObject:nil];
复制代码
SWIFT
苹果认为 performSelector: 不安全,所以在 Swift 去掉了这个方法。 Note: The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe.
上述2种创建线程方式的优缺点
- 优点:简单快捷
- 缺点:无法对线程进行更详细的设置
其他方法
//取消线程
- (void)cancel;
//启动线程
- (void)start;
//判断某个线程的状态的属性
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
@property (readonly, getter=isCancelled) BOOL cancelled;
//设置和获取线程名字
-(void)setName:(NSString *)n;
-(NSString *)name;
//获取当前线程信息
+ (NSThread *)currentThread;
//获取主线程信息
+ (NSThread *)mainThread;
// 是否为主线程(类方法)
+ (BOOL)isMainThread;
// 是否为主线程(对象方法)
- (BOOL)isMainThread;
//使当前线程暂停一段时间,或者暂停到某个时刻
+ (void)sleepForTimeInterval:(NSTimeInterval)time;
+ (void)sleepUntilDate:(NSDate *)date;
// 强制停止线程-> 进入死亡状态
+ (void)exit;
//注意:一旦线程停止(死亡)了,就不能再次开启任务
复制代码
更详尽的博客:
用来介绍 iOS 多线程中,pthread、NSThread 的使用方法及实现。
第一部分:pthread 的使用、其他相关方法。
第二部分:NSThread 的使用、线程相关用法、线程状态控制方法、线程之间的通信、线程安全和线程同步,以及线程的状态转换相关知识。