多线程NSThread状态控制—— 新建、就绪、运行、阻塞、死亡几个状态

1、线程的状态


NSThread *thread = [[Thread alloc] initWithTarget: self selector:@selector(run) object: nil];
[thread start];
知识点一:新建状态、就绪状态、运行状态
在thread没有start之前alloc之后处于一个新建状态,进程会为其线程分配内存(把线程放入到内存中)。一旦thread调用了start之后,thread就会被放到可调度线程池中。即线程就会由刚才的新建(New)状态转入到就绪状态(Runnable)。当线程处于就绪状态时,就有机会获取CPU时间片的机会。当处于就绪状态的线程获得了时间片(CPU调度当前线程),此线程就会处于运行状态(Running).
注意:因为处理器其实只是一个单核的主线程,不断的在轮流调度处于线程池中的线程,当线程池中的某个线程被调度时是处于运行状态,当此线程被调度执行一个时间片后失去的CPU的处理(因为CPU是轮流调度线程池中的线程的)就会返回到就绪状态。即当CPU调度线程池中的别的线程时当前线程会处于就绪状态,当当前线程被调度时就会处于运行状态。就绪状态和运行状态都是针对线程池中的线程而言的。
知识点二:阻塞状态
当正处于运行状态的线程调用的sleep休眠方法或在等待同步锁时就会被从线程池移到内存中去,即由运行状态变为阻塞状态(Blocked),一旦此线程休眠结束或者获得同步锁,就会被放到线程池中转为就绪状态等待CPU的调度。
需要注意的是:
注意点一:阻塞状态是针对于处于运行状态的线程而言的,也就是说只有处于运行状态的线程才可能转为阻塞状态。
注意点二:阻塞状态和新建状态是不同的,虽然都是处于内存中。因为处于新建状态的线程不调用start方法是无法被移到线程池中转为就绪状态的。而阻塞状态的线程只有在休眠结束或获得同步锁时才会转为就绪状态。
注意点三:CPU只轮流执行线程池中的线程,即只有就绪状态和运行状态的线程才有可能被执行。
知识点三:死亡状态(Dead) 当处于运行状态的线程任务执行完毕,或者出现异常或者强制退出都会直接导致死亡处于Dead状态。当线程死亡后就会被销毁,从内存中移除。所以一旦线程死亡就永远不可能被在调度。
知识点四:控制线程状态
启动线程
-(void)start;
// 进入就绪状态->运行状态。当线程任务执行完毕,自动进入死亡状态。
阻塞(暂停)线程
+(void)sleepUntilDate:(NSDate *)date;
+(void)sleepForTimeInterval: (NSTimerInterval) ti;
// 进入阻塞状态
强制停止线程
+(void) exit;
// 进入死亡状态

注意:一旦线程死亡,就不能再次开启任务。

新建工程,代码如下:

//
//  ViewController.m
//  线程状态控制assdsd
//
//  Created by apple on 15/10/4.
//  Copyright (c) 2015年 LiuXun. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSThread *currentThread = [NSThread currentThread];
    NSLog( @"%d",currentThread.isMainThread);
    // 1新建一个线程—— 分配到内存中,处于新建状态
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    
    // 2、启动线程—— 将线程从内存中移到可调度的线程池中
    [thread start];
}

-(void)run
{
    NSLog(@"%s",__func__);   // 用于打印当前代码属于哪个类 调用的哪个方法
    
    NSThread *currentThread = [NSThread currentThread];
    NSLog( @"%d",currentThread.isMainThread);
    
    // 刚进来就睡会
    //    [NSThread sleepForTimeInterval:2.0];  // 此方法表示让当前线程休眠多长时间
    
    //此方法表示让当前的线程,即调用当前所在方法的线程 休眠到指定的时间点
    //    [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:3.0]];
    
    for (int i=0; i<20; i++) {
        if (i == 10) {  // 满足条件以后,当前线程就会处于阻塞状态
            [NSThread sleepForTimeInterval:3.0];
        }
        
        if (i == 15) {   // 一旦达到某个条件,就强制终止线程的执行
            //  一旦强制终止,就无法再启动
            //  一旦强制终止,后面的代码就无法再执行
            [NSThread exit];  // 让当前线程死亡
        }
        NSLog(@"%@-----%d",[NSThread currentThread], i);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
运行结果如下:








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值