iOS多线程 pthread、NSThread

系列文章:

多线程

多线程 pthread、NSThread

多线程 GCD

多线程 NSOperation

多线程运用

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』详尽总结

用来介绍 iOS 多线程中,pthread、NSThread 的使用方法及实现。

第一部分:pthread 的使用、其他相关方法。

第二部分:NSThread 的使用、线程相关用法、线程状态控制方法、线程之间的通信、线程安全和线程同步,以及线程的状态转换相关知识。

推荐阅读更多精彩内容