iOS多线程之二:NSThread的使用

NSThread NSThread封装性最差,最偏向于底层,主要基于thread使用,生命周期需要手动管理,所以这套方案也是偶尔用用,比如 [NSThread currentThread],它可以获取当前线程类,你就可以知道当前线程的各种属性,用于调试十分方便。

一、线程创建

// 创建并自动启动
[NSThread detachNewThreadSelector:@selector(threadAlloc:) toTarget:self withObject:nil];

// 先创建线程,再启动
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:obj];
[newThread run];

// ios(10.0),线程的创建,线程创建后直接运行
[NSThread detachNewThreadWithBlock:^{
   [do something];
}];

[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:obj];

Paste_Image.png

二、线程之间的通讯

// 在主线程中运行方法,wait表示是否阻塞这个方法的调用,如果为YES则等待主线程中运行方法结束,一般可用于在子线程中调用UI方法。
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

// 隐含产生新线程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;

// 在指定线程中执行,但该线程必须具备run loop。
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

三、NSThread的其它一些常用的方法

+ (NSThread *)currentThread;                     // 获得当前线程
+ (void)sleepForTimeInterval:(NSTimeInterval)ti; // 线程休眠
+ (NSThread *)mainThread;                        // 主线程,亦即UI线程了
+ (BOOL)isMainThread;                            // 判断当前线程是否是主线程
+ (BOOL)isMultiThreaded;                         // 判断当前线程是否是多线程
+ (void)sleepUntilDate:(NSDate *)date;           // 当前线程休眠到指定日期
+ (void)exit;                                    // 强行退出当前线程
+ (double)threadPriority;                        // 获取当前线程线程优先级
+ (BOOL)setThreadPriority:(double)p;             // 给当前线程设定优先级,调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高。
+ (NSArray *)callStackReturnAddresses            // 线程的调用都会有函数的调用函数的调用就会有栈返回地址的记录,在这里返回的是函 数调用返回的虚拟地址,说白了就是在该线程中函数调用的虚拟地址的数组
+ (NSArray *)callStackSymbols                    // 同上面的方法一样,只不过返回的是该线程调用函数的名字数字
+ (BOOL)isMainThread;                            // 当前线程是否主线程
- (BOOL)isMainThread; 
- (BOOL)isExecuting;                             // 线程是否正在运行
- (BOOL)isFinished;                              // 线程是否已结束
- (void)cancel                                   // 终止线程循环
- (void)start                                    // 开启线程循环
- (void)isCancelled;                             //判断线程是否撤销
- (void)setName:(NSString *)n;                   //设置线程名称

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

C# 窗体常用API函数 应用程序窗体查找

常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runti...

5306
来自专栏ASP.NETCore

使用Rx Framework实现XAML中的物体拖动

酝酿两年之后,微软发布了Reactive Extensions(Rx)库。Rx把事件驱动UI与LINQ、并发性和异步调用结合起来。

932
来自专栏服务端技术杂谈

推荐:多线程的实现方式及经典示例

iOS中实现多线程的技术方案 ? pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInte...

46616
来自专栏博客园

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

转自:https://www.cnblogs.com/sheldon-lou/p/9495377.html

1172
来自专栏一“技”之长

iOS多线程编程之一——NSThread线程管理

NSTread是iOS中进行多线程开发的一个类,其结构逻辑清晰,使用十分方便,但其封装度和性能不高,线程周期,加锁等需要手动处理。

953
来自专栏张善友的专栏

Autofac正式发布2.1版

Nicholas Blumhardt经过了2年多的开发,设计和试验,Autofac发布了第二版,针对1.4版本进行了重组,提供了更好的开发体验,你可以到这里下载...

20010
来自专栏赵俊的Java专栏

Java 爬知乎某个问题下的所有图片

6494
来自专栏一“技”之长

iOS中通知中心(NSNotificationCenter)的使用总结

@property (readonly, copy) NSString *name;

653
来自专栏冰霜之地

ReactiveCocoa 中 RACCommand 底层实现分析

在ReactiveCocoa 过程中,除去RACSignal和RACSubject这些信号类以外,有些时候我们可能还需要封装一些固定的操作集合。这些操作集合都是...

1632
来自专栏xingoo, 一个梦想做发明家的程序员

winsock库

加载Winsock库函数 : WSAStartup 1 int WSAStartup( 2 WORD wVersionReques...

1995

扫码关注云+社区

领取腾讯云代金券