iOS多线程之--NSThread



iOS多线程demo

iOS多线程之--NSThread

iOS多线程之--GCD详解

iOS多线程之--NSOperation

iOS多线程之--线程安全(线程锁)

iOS多线程相关面试题



NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期,平时开发中使用的并不多。

1. 创建线程

NSThread实例化对象有2中方式,一种是通过target的方式执行任务,一种是通过block的方式执行任务。另外还有2种隐式创建线程的方式。

1.1 target方式实例化

- (void)threadInitTarget{
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(task1) object:nil];
    thread.name = @"thread1"; // 给线程取名
    thread.threadPriority = 0.3; // 设置线程优先级
    [thread start]; // 启动线程
}

- (void)task1{
    NSLog(@"task1--%@",[NSThread currentThread]);
}

// ***************打印结果***************
2019-12-31 15:43:16.889148+0800 MultithreadingDemo[42576:4668160] task1--<NSThread: 0x600002b17140>{number = 7, name = thread1}

1.2 block方式实例化

- (void)threadInitBlock{
    NSThread *thread = [[NSThread alloc] initWithBlock:^{
       NSLog(@"task2--%@",[NSThread currentThread]);
    }];
    thread.name = @"thread2";
    [thread start];
}

// ***************打印结果***************
2019-12-31 15:43:21.130273+0800 MultithreadingDemo[42576:4668204] task2--<NSThread: 0x600002beacc0>{number = 8, name = thread2}

1.3 target方式隐式创建线程

- (void)implicitThreadTarget{
    [NSThread detachNewThreadSelector:@selector(task3) toTarget:self withObject:nil];
}

- (void)task3{
    NSLog(@"task3--%@",[NSThread currentThread]);
}

// ***************打印结果***************
2019-12-31 16:24:31.760099+0800 MultithreadingDemo[55958:4841154] task3--<NSThread: 0x60000081dcc0>{number = 7, name = (null)}

1.4 block方式隐式创建线程

- (void)implicitThreadBlock{
    [NSThread detachNewThreadWithBlock:^{
        NSLog(@"task4--%@",[NSThread currentThread]);
    }];
}

// ***************打印结果***************
2019-12-31 16:24:34.696310+0800 MultithreadingDemo[55958:4841190] task4--<NSThread: 0x6000008fa7c0>{number = 8, name = (null)}

2. NSThread 常用属性介绍

2.1 实例属性

@property (nullable, copy) NSString *name;

给线程取个名字,只是方便调试时知道是哪个线程,没有其它实际用途。


@property double threadPriority;

线程优先级,取值范围0.0-1.0,1.0表示最高优先级,默认是0.5.


@property NSQualityOfService qualityOfService;

这是iOS8之后新提供的设置优先级的方式。是一个枚举类型:

  • NSQualityOfServiceUserInteractive:与用户交互的任务,这些任务通常跟UI级别的刷新相关,比如动画,这些任务需要在一瞬间完成。
  • NSQualityOfServiceUserInitiated:由用户发起的并且需要立即得到结果的任务,比如滑动scroll view时去加载数据用于后续cell的显示,这些任务通常跟后续的用户交互相关,在几秒或者更短的时间内完成。
  • NSQualityOfServiceUtility:一些可能需要花点时间的任务,这些任务不需要马上返回结果,比如下载的任务,这些任务可能花费几秒或者几分钟的时间。
  • NSQualityOfServiceBackground:这些任务对用户不可见,比如后台进行备份的操作,这些任务可能需要较长的时间,几分钟甚至几个小时。
  • NSQualityOfServiceDefault:优先级介于user-initiated 和 utility,当没有 QoS信息时默认使用,开发者不应该使用这个值来设置自己的任务。

@property NSUInteger stackSize;

线程的堆栈大小,线程执行前堆栈大小为512K,线程完成后堆栈大小为0K。注意线程执行完毕后,由于内存空间被释放,不能再次启动。


@property (readonly) BOOL isMainThread;

是否是主线程。


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

线程是否正在执行。


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

线程是否执行完成。


@property (readonly, getter=isCancelled) BOOL cancelled;

线程是否已经取消。


2.2 类属性

@property (class, readonly, strong) NSThread *currentThread;

当前线程。


+ (BOOL)isMultiThreaded;

是否是多线程。


@property (class, readonly) BOOL isMainThread;

当前线程是否是主线程。


@property (class, readonly, strong) NSThread *mainThread;

主线程。


3. NSThread 的类方法

// 线程休眠到指定时间
+ (void)sleepUntilDate:(NSDate *)date;

// 线程休眠指定时长
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

// 退出线程
+ (void)exit;

// 是否是多线程
+ (BOOL)isMultiThreaded;

4. NSThread 其它相关方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait;

- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 1、简介:1.1 iOS有三种多线程编程的技术,分别是:1.、NSThread2、Cocoa NSOperatio...
    LuckTime阅读 1,345评论 0 1
  • 1. 线程的概念 首先简单叙述一下这两个概念,我们在电脑上单独运行的每个程序就是一个独立的进程,通常进程之间是相互...
    大成小栈阅读 425评论 0 0
  • NSThread: NSThread 是一个控制线程执行的对象,它不如 NSOperation抽象,通过它我们可以...
    蓝白自由阅读 612评论 0 4
  • 国庆之后真的很糟糕,有时候在深夜偷偷的问自己是不是不适合写代码?是不是不适合当程序员?是不是要转行才能见到未来?是...
    土鳖不土阅读 647评论 0 0
  • 今天下午和中财95级校友小范围聚会,听一个做私募基金的同学聊资本市场上并购重组等操盘案例。晚上和罗马风情王总聊摄影...
    一世惊鸿阅读 125评论 0 0