iOS 开发 多线程详解之线程生命周期控制

0.线程状态

iOS 开发 多线程详解之线程生命周期控制_第1张图片

新建 --> 就绪(在可调度线程池中,等待被CPU的调度执行) --> 运行
运行 --> CPU切换到其他的线程 --> 就绪
运行 --> 调用的sleep方法 --> 阻塞 --> sleep的时间到了 --> 就绪
运行 --> 任务执行完成 --> 死亡
运行 --> exit --> 死亡

1.新建

内存中创建了一个线程对象

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo) object:nil];

2.就绪

将线程放进可调度线程池,等待被CPU调度

[thread start];

3.运行

CPU负责调度”可调度线程池”中的处于”就绪状态”的线程
线程执行结束之前,状态可能会在”就绪”和”运行”之间来回的切换
“就绪”和”运行”之间的状态切换由CPU来完成,程序员无法干涉

4.阻塞

正在运行的线程,当满足某个条件时,可以用休眠或者锁来阻塞线程的执行

1.sleepForTimeInterval:休眠指定时长
[NSThread sleepForTimeInterval:1.0];

2.sleepUntilDate:休眠到指定日期
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];

3.互斥锁
@synchronized(self)

5.死亡

  • 正常死亡:线程执行结束
  • 非正常死亡:程序突然崩溃/当满足某个条件后,在线程内部强制线程退出,调用exit方法

代码演练

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 新建状态
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadDemo) object:nil];
    // 就绪状态 : 将线程放进"可调度线程池",等待被CPU调度.
    [thread start];

    // 主线程中的危险操作,不能在主线程中调用该方法.会使主线程退出
//    [NSThread exit];
}

- (void)threadDemo
{
    for (int i = 0; i < 6; i++) {

        NSLog(@"%d",i);

        //1. 当前线程,每循环一次,就休眠一秒
        [NSThread sleepForTimeInterval:1.0];

        //2. 满足某一条件再次休眠一秒
        if (2==i) {
            NSLog(@"我还想再睡一秒");
            // 休眠时间为从现在开始计时多少秒以后
            [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
        }

        //3. 满足某一条件线程死亡
        if (4==i) {
            NSLog(@"线程死亡");

            // 在调用exit方法之前一定要注意释放之前由C语言框架创建的对象.
            CGMutablePathRef path = CGPathCreateMutable();
            CGPathRelease(path);

            // 线程死亡
            [NSThread exit];

            // 当线程死亡之后,以后的代码都不会被执行
            NSLog(@"线程已经死亡");
        }
    }
    NSLog(@"循环结束");
}

关于exit的结论

  • 使当前线程退出.
  • 不能在主线程中调用该方法.会使主线程退出.
  • 当当前线程死亡之后,这个线程中的代码都不会被执行.
  • 在调用此方法之前一定要注意释放之前由C语言框架创建的对象.

你可能感兴趣的:(多线程,iOS开发)