NSThread学习笔记
来源:互联网 发布:三星手机系统优化 编辑:程序博客网 时间:2024/05/22 17:28
1.关于线程的创建和启动
iOS 使用NSThread类代表线程,创建新的线程也就是创建NSThread对象。
创建NSThread对象的方法有以下两种:
(1) + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullableid)argument; //创建并启动新的线程。
(2) - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullableid)argument; //创建一个线程对象,需要手动调用start方法,启动线程。
示例代码:
- (void)viewDidLoad {
[superviewDidLoad];
for(int i =0 ; i <100 ; i++)
{
NSLog(@"%@===========%d",[NSThreadcurrentThread],i);
if (i == 20 ) {
// 创建线程对象
NSThread *thread1 = [[NSThreadalloc]initWithTarget:selfselector:@selector(run)object:nil];
// 启动线程
[thread1 start];
// 创建并启动新线程
[NSThreaddetachNewThreadSelector:@selector(run)toTarget:selfwithObject:nil];
}
}
}
-(void)run
{
for (int i =0 ; i<100; i++) {
NSLog(@"%@ ============= %d",[NSThreadcurrentThread],i);
}
}
编译、运行改程序将可以看到线程的并发执行效果。
+ (NSThread *)currentThread; 方法用于获取当前正在执行的线程对象。
2.关于线程的状态
当线程对象调用了start方法之后,该线程只是出于就绪状态,并不是立即进入运行状态。至于线程何时开始运行,取决于系统的调度。如果程序希望子线程调用start方法之后立即执行,则可以在执行start方法之后执行如下方法,让当前线程睡眠即可。
[NSThreadsleepForTimeInterval:0.01];
注:当主线程结束时,其他线程并不会受到任何影响,也不会随之结束。一旦子线程启动起来,他就拥有和主线程相同的地位,不会受到主线程的影响。
线程对象调用方法isExecuting,如果返回值为YES就表示该线程正处于执行过程。调用方法isFinished,如果返回值为YES表示该线程执行完毕。
4.线程睡眠
如果需要让当前正在执行的线程暂停一段时间,则可以通过NSThread的sleep相关方法。NSThread提供的方法如下:
(1)+ (void)sleepUntilDate:(NSDate *)date; //让线程睡眠直到未来的某个时间
(2)+ (void)sleepForTimeInterval:(NSTimeInterval)ti; //让线程睡眠一段时间间隔
线程执行上述方法的任意一种就会进入到阻塞状态,处于阻塞状态的线程不会获得任何执行线程的机会。
5.线程优先级
每个线程在执行时都具有一定的优先级。线程的优先级决定了线程获得执行机会。每个子线程的默认优先级都是0.5。最高的优先级为1.0,最低为0.0
+ (double)threadPriority; //用于获取当前线程的优先级
+ (BOOL)setThreadPriority:(double)p; //用于设置线程的优先级
6.关于线程见的切换
由于在iOS开发中,只能在主线程中修改UI控件的属性。iOS提供以下方法回到主线程去执行刷新UI的操作。
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait modes:(nullableNSArray<NSString *> *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait;
指定在某个线程执行某些方法,iOS提供的方法如下所示:- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullableid)arg waitUntilDone:(BOOL)wait modes:(nullableNSArray<NSString *> *)array;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullableid)arg waitUntilDone:(BOOL)wait;
隐式开启新线程去执行某个操作:
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullableid)arg;
- 学习笔记 -- NSThread
- NSThread学习笔记
- iOS学习笔记-多线程基础(NSThread)
- IOS学习笔记2-NSThread,链式编程
- NsThread学习
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- iOS多线程学习笔记之一:NSThread常用方法
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- iOS 学习笔记 --- 多线程基础(2)--- NSThread
- iOS多线程学习笔记(GCD、RunLoop、NSThread)
- 学习:NSThread的使用
- iOS多线程学习---NSThread
- iOS学习笔记---利用NSThread实现异步更新UI和下载图片
- ios开发学习笔记——多进程编程之NSThread/GCD
- NSThread
- Java 集合:Map 系列(ConcurrentHashMap概念)
- Spring的IOC原理(转载)
- 筛选法求1到100以内的素数
- 【android基础一】Android四大基本组件介绍与生命周期
- 谈谈对Spring IOC的理解
- NSThread学习笔记
- P19 (**) Rotate a list N places to the left.
- 推荐书单
- (一)H264编码原理以及I帧B帧P帧
- LDA主题模型试验
- Java基础加强总结(三)——代理(Proxy)
- Java 集合:Map 系列(WeakHashMap概念)
- 符号及优先级
- QT Android 调用JAVA代码