iOS多线程实现——NSThread的简单使用

关于iOS多线程的实现方式有多种,今天来共同学习一下NSThread的简单使用,有疏忽的地方,还望各位不吝赐教。


一、NSThread初始化

// 1、创建线程 

/**
* 第一种方式创建线程
* 参数说明
* 第一个参数:目标对象 self
* 第二个参数:方法选择器 调用的方法
* 第三个参数:调用方法需要传递的参数 (进行赋值后可以在run:方法中当做参数接收)
*/

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(open:) object:@"创建线程"];

// 2、对线程可以进行命名。

thread.name = @"线程名称,以示区分";

// 3、线程优先级,范围是0.0-1.0 数字越大,被执行到的可能性越大,只是可能性不代表一定会被执行。

thread.threadPriority = 0.5;

// 4、开启线程

[thread start];

// 5、实现调用的方法

- (void)open:(NSString *)param{

//  [NSThread currentThread]  此方法可以获得当前线程

//  [NSThread mainThread]  此方法可以获得主线程

    NSLog(@"%@---------%@",param,[NSThread currentThread]);

}

// 打印: 创建线程---------{number = 3, name = 线程名称,以示区分}

/**

* 第二种方式创建线程

* 参数说明

* 第一个参数:方法选择器 调用的方法

* 第二个参数:目标对象 self

* 第三个参数:调用方法需要传递的参数 (进行赋值后可以在run:方法中当做参数接收)

*/

// 1、此方法没有返回值 相当于创建并启动线程

[NSThread detachNewThreadSelector:@selector(open:) toTarget:self withObject:@"分离子线程"];

// 2、实现调用的方法

- (void)open:(NSString *)param{

   NSLog(@"%@---------%@",param,[NSThread currentThread]);

}

// 打印:分离子线程---------{number = 3, name = (null)}

/**

* 第三种方式创建线程

* 参数说明

* 第一个参数:方法选择器 调用的方法

* 第二个参数:调用方法需要传递的参数 (进行赋值后可以在run:方法中当做参数接收)

*/

// 1、此方法没有返回值 隐式创建并启动线程

[self performSelectorInBackground:@selector(open:) withObject:@"开启后台线程"];

// 2、实现调用的方法

- (void)open:(NSString *)param{

   NSLog(@"%@---------%@",param,[NSThread currentThread]);

}

// 打印:开启后台线程---------{number = 3, name = (null)}

二、暂停当前线程

/**

* 暂停当前线程(阻塞)方式一

* 此方法代表让当前线程休眠两秒后再进行其他操作

*/

[NSThread sleepForTimeInterval:2.0];

/**

* 暂停当前线程(阻塞)方式二

* 此方法代表让当前线程休眠两秒后再进行其他操作

*/

[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

三、退出当前线程

/**

* 退出当前线程

* 此方法代表强制退出当前线程

*/

[NSThread exit];

四、线程之间的通信

/**

*  关于线程之间的通信的说明:

*  1、主线程是专门用来进行更新UI和处理用户事件的线程,一般耗时操作放在子线程中执行。

*  2、当子线程将任务完成后,需要和主线程进行通信,将获取的数据展示到UI中,以便和用户进行交互。 

*   在此使用一个例子来进行说明:在子线程中下载一张图片,然后在主线程中进行展示。

*/

// 1、使用第二种方式创建线程

  [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];

// 2、进行downloadImage方法的实现

- (void)downloadImage{

// 2.1、确定图片的URL地址

    NSURL *url = [NSURL URLWithString:@"此处需要图片的URL地址"];

// 2.2、根据图片的URL地址下载图片二进制数据到本地

    NSData *data = [NSData dataWithContentsOfURL:url];

// 2.3、转换图片格式 将二进制数据转换为图片数据

    UIImage *image = [UIImage imageWithData:data];

    NSLog(@"downloadImage-----%@",[NSThread currentThread]);

// 2.4、将图片数据交给主线程显示图片 以下三种方式任选一种即可

/**

* 与主线程通信的方式一

* 第一个参数:回到主线程调用哪个方法

* 第二个参数:前面方法要传递的参数

* 第三个参数:是否等待 如果等待相当于当前方法为阻塞状态,end的打印会在图片显示方法执行完后进行打印

*/

 [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:NO];

/**

* 与主线程通信的方式二

* 第一个参数:回到主线程调用哪个方法

* 第二个参数:指定哪个线程执行showImage:的方法(本方法相比于方式一可以指定线程执行)

* 第三个参数:前面方法要传递的参数

* 第四个参数:是否等待 如果等待相当于当前方法为阻塞状态,end的打印会在图片显示方法执行完后进行打印

*/

 [self performSelector:@selector(showImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];

NSLog(@"end-------------------------end");

}

// 3、显示图片的方法

- (void)showImage:(UIImage *)image{

   // 打印当前线程信息

    NSLog(@"showImage-----%@",[NSThread currentThread]);

   // 显示图片

   self.iconImageView.image = image;

}

/**

* 与主线程通信的方式三

* 说明:

* 1、使用此方法可以省略以上显示图片的方法,故而写在这里,此代码与以上建立与主线程通信代码书写的位置相同;

* 2、因为在此案例中是直接在UIImageView中进行图片赋值,所以本方法具有特殊性。

* 3、可以使用的原因是因为performSelector:onThread:方法是在NSObject的分类中,所以只要是对象就可以进行调用。

*/

[self.iconImageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

五、线程的声明周期

当线程中的任务执行完毕后才会释放,并不会因为它是一个局部变量,在出了作用域后就被释放。

关于线程的状态的声明:

1、New(创建)

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(open:) object:@"创建线程"]; // 此代码执行完毕后会在内存中创建一个线程对象。

2、Runnable(就绪状态)

[thread start]; // 线程对象进入就绪状态,并放入可调度线程池中,只有在可调度线程池中的线程对象才可以被系统调度。

3、Running(运行状态)

当线程对象被系统调度时就处在运行状态,在系统调度其他线程的时候,就进入就绪状态。

4、Blocked(阻塞状态)

在调用sleep等方法的时候,线程会进入阻塞状态。线程对象会被从可调度线程池中移除出来,这个时候线程对象还在内存中存在,但是系统不会调度这个线程对象。

当然了,当sleep的设置时间到了以后,会再从内存中将线程对象放入可调度线程池中,线程对象会再进入就绪状态。

5、Dead(死亡状态)

当线程对象把任务执行完毕或者被强制退出,则进入死亡状态。这个时候内存中线程对象被销毁,内存中已经没有此线程对象了。


六、自定义NSThread

/**

* 说明

* 1、 关于自定义的NSThread创建线程的方式可以使用allac init 进行创建;

*  2、在自定义NSThread的.m文件中实现main方法,写在这里就可以实现自定义NSThread执行指定的任务;

* 3、当查看其它工程的源码,发现NSThread创建线程的方式是以下方式,则方便查找相关任务的执行代码。

*/

//  1、进行线程的创建

GHThread *thread = [[GHThread alloc] init];

//  2、开启线程

[thread start];

// 3、在GHThread.m中实现main方法

- (void)main{

    NSLog(@"end---------%@",[NSThread currentThread]);

}

// 打印:end---------{number = 5, name = (null)}


写在最后的话:关于NSThread虽然简单易用,可以直接操作线程对象,但是线程的生命周期需要手动管理,使用频率不是很高。关于iOS多线程的其他实现方式会在以后继续学习和分享。。。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容