NSThread实现多线程

  • 创建NSThread有三种方式
//1.创建一个新线程对象
-(instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg
//2.创建并启动新线程
 +(void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
 //3.隐式创建并启动线程
 -()void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg

三种方法都是将target对象的selector方法转换为线程执行体,selector最多接收一个参数,arg代表传给selector方法的参数。

  • 举个🌰:
 -(void)viewDidLoad {
    [super viewDidLoad];
    for (int i = 0; i < 100; i++) {
        NSLog(@"===%@===%d",[NSThread currentThread], i);
        if (i == 20) {
            //创建线程的对象
            NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
            //启动线程
            [thread start];
            [NSThread sleepForTimeInterval:0.001];
            //创建并启动新线程
            //[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
        }
    }
}

-(void)run{
    for (int i = 0; i < 100; i++) {
        NSLog(@"-----%@------%d",[NSThread currentThread], i);
    }
}
  • +(NSThread *)currentThread:返回当前正在执行的线程对象。

  • 此程序创建了两个线程,程序显式的创建了一个子线程。当iOS应用运行后,至少创建一个主线程(UI线程)。

  • 程序创建线程后,该线程处于新建状态,但是系统仅仅为其分配了内存,并初始化了成员变量的值。此时的线程对象没有线程的动态特征,程序也不会执行线程的执行体。在调用start方法后,该线程处于就绪状态,何时运行取决于系统调度。

  • 线程的结束方式
    1.线程执行体方法执行完成,线程正常结束。
    2.线程执行过程中出现错误。
    3.调用NSThread类的exit方法终止当前正在执行的线程。

举个🌰:

@implementation FKViewController
NSThread* thread;
- (void)viewDidLoad
{
    [super viewDidLoad];
    // 创建新线程对象
    thread = [[NSThread alloc] initWithTarget:self selector:@selector(run)
        object:nil];
    // 启动新线程
    [thread start];
    
    //[self performSelectorInBackground:@selector(run) withObject:nil];
}
- (void)run
{
    for(int i = 0 ; i < 100 ; i++)
    {
        if([NSThread currentThread].isCancelled)
        {
            // 终止当前正在执行的线程
            [NSThread exit];
        }
        NSLog(@"-----%@----%d" , [NSThread currentThread].name, i);
        // 每执行一次,线程暂停0.5秒
        [NSThread sleepForTimeInterval:0.5];
    }
}
- (IBAction)cancelThread:(id)sender
{
    // 取消thread线程,调用该方法后,thread的isCancelled方法将会返回NO
    [thread cancel]; 
}
@end
  • thread对象调用cancel方法,向thread对象发送取消信号,这样可以使thread对象的isCancelled方法返回YES。(在线程执行过程中isExecuting方法返回YES;线程执行完成后isFinished方法返回YES)

  • 线程对象调用exit方法终止线程。

  • +(void)sleepForTimeInterval:(NSTimeInterval)ti
    让当前正在执行的线程暂停ti秒,进入阻塞状态。

  • +(void)sleepUntilDate:(NSDate *)aDate
    让当前正在执行的线程暂停到aDate代表的时间,并进入阻塞状态。

  • 线程优先级
    1.+threadPriority:该类方法获取正在执行线程的优先级。
    2.-threadPriority:该实例方法获取调用该方法的线程对象的优先级。
    3.+(BOOL)setThreadPriority:(double)priority:该类方法用于设置当前正在执行的线程的优先级。
    4.-(BOOL)setThreadPriority:(double)priority:该实例方法用于设置当前正在执行的线程的优先级。

注意:setThreadPriority:(double)priority方法的参数可以是一个double类型的浮点数,范围为0.0~1.0,其中1.0等级最高,0.0等级最低。

  • 举个🌰:
-(void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"UI线程的优先级为:%g", [NSThread threadPriority]);
    //创建第一个线程对象
    NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    //设置线程的名字
    thread1.name = @"线程A";
    NSLog(@"线程A的优先级为:%g",thread1.threadPriority);
    //设置使用最低优先级
    thread1.threadPriority = 0.0;
    NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
    thread2.name = @"线程B";
    NSLog(@"线程A的优先级为:%g",thread2.threadPriority);
    thread2.threadPriority = 1.0;
    [thread1 start];
    [thread2 start];
}
-(void)run{
    for (int i = 0; i < 100; i++) {
        NSLog(@"-----%@-----%d",[NSThread currentThread].name, i);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • .一.进程 进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空...
    IIronMan阅读 4,465评论 1 33
  • 本文选译自《Threading Programming Guide》。 导语 线程技术作为在单个应用程序中并发执行...
    巧巧的二表哥阅读 2,414评论 4 24
  • 凡是跟UI相关的都是在主线程执行的 UIKit类库的线程都是不安全的 所以我们需要在主线程上更新UI 因此主线程又...
    xwf_code阅读 585评论 0 0
  • 原谅不美好。 文/梅雨 生活最大的本事就是它永远不会让所有人都如愿以偿。你想象得有多么美好,现实就会有多么残酷。 ...
    梅雨阅读 201评论 0 1
  • AI芯片发展阶段: 第一阶段,语音助理阶段; 第二阶段:面部识别阶段; 第三阶段:互动感知阶段; 第四阶段,智能处...
    众心无相阅读 178评论 0 0