NSThread总结

来源:互联网 发布:哑铃锻炼软件 编辑:程序博客网 时间:2024/05/21 09:27

NSThread是对线程的一个抽象。

NSThread提供了:
start(), cancel(), exit()等控制线程状态的接口;
isExecuting, isCanceled, isFinished等查询线程状态的接口;
threadDictionary,name,stackSize等和线程相关的信息;
priority:可以查看和设置该thread的优先级

一些相关的通知:
NSDidBecomeSingleThreadedNotification
NSThreadWillExitNotification
NSWillBecomeMultiThreadedNotification


开启一个新线程的方法
1、先创建,再开启
// 创建线程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test:) object:nil];
// 启动该线程
[thread start];

2、分离一个子线程
[NSThread detachNewThreadSelector:@selector(test:) toTarget:self withObject:@”分离子线程”];

3、开启一条后台线程
[self performSelectorInBackground:@selector(test:) withObject:@”后台线程”];


NSThread的生命周期:

这里写图片描述

控制线程状态

1.启动线程
[thread start];
线程进入就绪状态, 当线程执行完毕,进入死亡状态

2.阻塞(暂停)线程
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)t;
线程进入阻塞状态

3.强制停止线程
+(void)exit;

代码演示:
让任务执行100次, 看下效果
- (void)test {
for (int i = 0; i < 100; ++i) {
NSLog(@”%d - %@”, i, [NSThread currentThread]);
}
NSLog(@”—-end—-“);
}
这里写图片描述

让任务在执行过程中强制停止
- (void)test {
for (int i = 0; i < 100; ++i) {
NSLog(@”%d - %@”, i, [NSThread currentThread]);
if (i == 10) {
[NSThread exit];
}
}
}
这里写图片描述
当达到停止条件时, 线程就强制退出了

线程一旦进入到死亡状态, 线程也就停止了, 就不能再次启动任务.

4.cancel一个线程
thread.canceled = YES;
这个方法仅仅是把该线程的thread置为yes,线程依旧会正常执行。
这时需要使用者在代码中周期性的检查canceled属性(和NSOperation的cancel属性一样),当发现cancel置为yes时,可以先做一些线程的清理工作,然后中断线程


线程安全:
资源共享导致多个线程操作同意数据时数据错乱:
解决方法:互斥锁
@synchronized(锁对象) {
//资源互斥区的操作
}

加锁的注意点

  • 必须是全局唯一的.
  • 加锁的位置
  • 加锁的前提条件(多条线程抢夺同一块资源)

加锁的优点

  • 能有效的防止因为多线程抢夺资源造成的数据安全问题

加锁的缺点

  • 会耗费一些额外的 CPU 资源

  • 造成线程同步(多条线程在同一条线上执行,而且是按顺序的执行)

线程间通信:


线程间通信的体现

  • 一个线程传递数据给另一个线程
  • 在一个线程中执行完毕特定任务后, 转到另一个线程继续执行任务

常用方法:
- (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;

0 0