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];

3.关于线程的终止
线程会以以下三种方法之一结束,结束后线程就处于死亡状态。
(1)线程执行完毕,正常死亡。
(2)线程执行过程中出现错误。
(3)直接调用NSThread类的exit方法来中止正在执行的线程。

 注:当主线程结束时,其他线程并不会受到任何影响,也不会随之结束。一旦子线程启动起来,他就拥有和主线程相同的地位,不会受到主线程的影响。

线程对象调用方法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;






2 0
原创粉丝点击