NSThread的基本使用

NSThread是什么

这是Foundation框架,是OC层面的线程。面向对象,可以直接操作线程对象。

NSThread如何创建

手动创建线程的方法有三种,一种是直接使用NSThread new 一个出来。

使用alloc init

  • 手动调用start进行启动线程
  • 可以对线程属性对象设置

参数说明

参数 类型 是否可为空 描述
target id NO 目标对象,一般用self。
selector SEL NO 这个可以理解为调用指定的方法
argument id YES 参数,只能够有一个,但是可以以字典的方式变相的添加多个对象

有参数的情况

1
2
3
4
5
6
7
8
NSThread *thread = [[NSThread alloc] initWithTarget:self
selector:@selector(run:)
object:@{@"name": @"lucaslee"}];
[thread start];
- (void)run:(NSDictionary *)info {
NSLog(@"do something.");
}

无参数的情况

selector 这里没有:,并且参数为nil。

1
2
3
4
5
6
NSThread *thread = [[NSThread alloc] initWithTarget:self
selector:@selector(run)
object:nil];
- (void)run {
NSLog(@"do something.");
}

detachNewThreadSelector

分离出一条子线程

  • 自动启动线程
  • 方法调用没有返回值,所以无法对线程对象属性进行设置

参数说明

同alloc init的创建线程的参数一样,只是target与selector位置调换了而已

方法调用

1
2
3
[NSThread detachNewThreadSelector:@selector(run:)
toTarget:self
withObject:@{@"name": @"lucaslee"}];

performSelectorInBackground

这个是NSObject的分类方法,所以只要是继承NSObject的类都可以调用该方法。

  • 后台线程,自动启动线程
  • 方法调用没有返回值,所以无法对线程对象属性进行设置
1
2
[self performSelectorInBackground:@selector(run:)
withObject:@{@"name": @"lucaslee"}];

NSThread属性

设置线程名称

1
thread.name = @"db";

控制台输出结果

1
do something. currentThread = <NSThread: 0x7f882a42f9c0>{number = 2, name = db}

设置线程优先级

threadPriority

线程优先级的取值范围是0.0 ~~~ 1.0 1.0最高,这个范围的优先级映射到操作系统的优先级值,默认的值可能是0.5,但是由于优先级是由内核决定的,所以就不保证此值实际上讲师什么

1
thread.threadPriority = 1.0

qualityOfService

实际上threadPriority已经过时了,需要使用qualityOfService替代。

1
thread.qualityOfService = NSQualityOfServiceUserInteractive;

这是一个枚举值。

stackSize

创建线程是会有开销的,可以使用stackSize来更改堆栈的大小。
但是要满足一下条件

  • 必须是字节并且是4KB的倍数。
  • 必须在启动线程之前设置改属性
1
thread.stackSize = 4096;

NSThread生命周期

分别是新建,可运行,运行中,睡眠,阻塞,死亡。

启动

1
- (void)start;

运行中

这个是线程的只读属性。

1
@property(readonly, getter=isExecuting) BOOL executing

休眠 暂停

1
2
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

取消

1
2
3
4
5
// 设置取消
- (void)cancel
// 查看线程是否是取消状态
@property(readonly, getter=isCancelled) BOOL cancelled

已完成

线程的只读属性。

1
@property(readonly, getter=isFinished) BOOL finished

退出

1
+ (void)exit;

其他的API

主线程

1
2
3
4
@property (readonly) BOOL isMainThread;
+ (BOOL)isMainThread;
+ (NSThread *)mainThread;

当前线程

1
+ (NSThread *)currentThread;

线程成本

多线程会占用你应用程序(和系统的)的内存使用和性能方面的资源。每个线程都需要分配一定的内核内存和应用程序内存空间的内存。管理你的线程和协调其调度所需的核心数据结构存储在使用Wired Memory的内核里面。你线程的堆栈空间和每个线程的数据都被存储在你应用程序的内存空间里面。这些数据结构里面的大部分都是当你首次创建线程或者进程的时候被创建和初始化的,它们所需的代价成本很高,因为需要和内核交互。

资源项 大约消耗
内核 1kb
栈空间 1. 子线程 512KB 2. Mac OS 8MB 3. iOS 主线程 1MB
创建时间 90毫秒

参考

Thread Management 中文
Thread Management

坚持原创技术分享,您的支持将鼓励我继续创作!