线程基础及NSThread,线程操作之NSThread

作者: 韦德国际1946  发布:2019-08-19

IOS-线程操作之NSThread/NSOperation/GCD

1NSThread.注解线程,运转线程:(第三个参数申明了目的类,第三个参数表明了对象措施,第2个参数为该方法的参数)

NSThread *thread=[[NSThread alloc] initWithTarget:selfselector:@selector(saleTicketMethod:) object:@"线程--1"];
[thread start];

2.IOS跟Android一律都以线程不安全的 也便是全部UI更新都不可能不在主线程内完毕,这样,当大家在另一条线程中想要修改View,如下:

(第八个参数为目的措施,第一个参数为该格局的参数 ,何况只可以是1个 。)

[self performSelectorOnMainThread:@selector(updateView:) withObject:str waitUntilDone:YES];

3.当见仁见智的线程抢夺共同的能源时,要求对线程加锁,以下为七个卖票的种类例子:

#import "CSZViewController.h"

@interface CSZViewController ()
{
    int _ticketNum;
    NSLock *_lock;
}
@end

@implementation CSZViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void) updateView:(NSString *) text
{
    NSString *str=[NSString stringWithFormat:@"%@ n%@",self.textView.text,text];
    self.textView.text=str;
}

- (void)saleTicketMethod:(NSString *)threadName
{
    while (true) {

        if (_ticketNum>0) {
            [_lock lock];
            NSString *str=[NSString stringWithFormat:@"%@线程的票数为:%d",threadName,_ticketNum];
            [self performSelectorOnMainThread:@selector(updateView:) withObject:str waitUntilDone:YES];

            _ticketNum--;
            [_lock unlock];
            if ([threadName isEqualToString:@"线程--1"]) {
                [NSThread sleepForTimeInterval:1.0];
            }else{
                [NSThread sleepForTimeInterval:2.0];
            }


        }else
        {
            NSString *str=[NSString stringWithFormat:@"售票结束!%@",threadName];
            [self performSelectorOnMainThread:@selector(updateView:) withObject:str waitUntilDone:YES];
            break;
        }

    }
}

- (IBAction)threadClick:(id)sender {

    _ticketNum=20;
    //计算剩余票数
    //如果有票,则卖出
    //没有则停止;
    _lock=[[NSLock alloc] init];

    NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(saleTicketMethod:) object:@"线程--1"];
    NSThread *thread1=[[NSThread alloc] initWithTarget:self selector:@selector(saleTicketMethod:) object:@"线程--2"];
    [thread start];
    [thread1 start];
}



@end

---NSOperation的施用是苹果为大家兑现多线程通过的一套简洁的API。它为大家防止抢夺同个财富做了遮盖。同期定义了线程队列的概念,开荒人士不用思索这方面包车型客车事物。

其用法首要分为3点:

1,定义线程队列 (设置同期运维的线程数,因为开线程也是需求开销财富的,类比JAVA的线程池)

NSOperationQueue *queue=[[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:5];

2.概念异步线程 。(同样,以下参数也是宣称了线程方法所在的类以及所须要的方式参数)

NSInvocationOperation *opera=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operaSaleMethod:) object:@"线程操作1"];
NSInvocationOperation *opera2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operaSaleMethod:) object:@"线程操作2"];

3.将队列放进线程中。线程职分就能够通过队列自动分配。

[queue addOperation:opera];
[queue addOperation:opera2];

4.对此操作的秘籍,使用一样能源,没有必要做加锁的拍卖

-(void) operaSaleMethod:(NSString *)threadName
{
    while (true) {
        if (_ticketNum>0) {

            if ([threadName isEqualToString:@"线程操作1"]) {
                [NSThread sleepForTimeInterval:2.0];
            }else{
                [NSThread sleepForTimeInterval:1.2];
            }

            NSString *str=[NSString stringWithFormat:@"%@线程的票数为:%d",threadName,_ticketNum];

            [self performSelectorOnMainThread:@selector(updateView:) withObject:str waitUntilDone:YES];
            _ticketNum--;
        }else
        {
            NSString *str=[NSString stringWithFormat:@"%@售票结束!",threadName];
            [self performSelectorOnMainThread:@selector(updateView:) withObject:str waitUntilDone:YES];
            break;
        }
    }

}

GCD是用C语言写的协助二十四线程开辟的一套 API,它的格局跟Operation大概,并在此基础上扩充了组的定义,在全部组达成后提供一套触发通告的机制。

1.概念队列

//#define DISPATCH_QUEUE_PRIORITY_HIGH        2
    //#define DISPATCH_QUEUE_PRIORITY_DEFAULT     0
    //#define DISPATCH_QUEUE_PRIORITY_LOW         (-2)
    //#define DISPATCH_QUEUE_PRIORITY_BACKGROUND  INT16_MIN
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

2.定义组

dispatch_group_t group=dispatch_group_create();

3.概念异步职务并增加到队列中

dispatch_group_async(group, queue, ^{
        [self gcdSaleMethod:@"线程操作1"];
    });
    dispatch_group_async(group, queue, ^{
        [self gcdSaleMethod:@"线程操作2"];
    });

4.队列获取文告

dispatch_group_notify(group, queue, ^{
        NSLog(@"线程操作完成");
    });

从日记能够见到 唯有全体线程跑完了 才会回调该block中的内容

2014-08-11 15:08:38.982 ThreadSample01[5256:4007] 线程操作2售票结束!
2014-08-11 15:08:39.037 ThreadSample01[5256:1903] 线程操作1售票结束!
2014-08-11 15:08:39.042 ThreadSample01[5256:4007] 线程操作完成

1NSThread.评释线程,运营线程:(第二个参数注解了指标类,第三个参数评释了对象措施,第1个参数为该方...

一.多线程

  • 进程是指在系统中正在周转的七个应用程序。种种进度之间是独自的,每一种进度均运转在其专用且受保险的内部存款和储蓄器空间内。(比就像是有的时候间开拓迅雷、Xcode,系统就能分别运营2个经过。)

  • 线程是经过的大旨进行单元,1个进度要想举办职务,必须得有线程(每1个经过至少要有1条线程,并且1个线程中使命的实行是串行的)。

  • 多线程线程基础及NSThread,线程操作之NSThread。是指1个进度中能够拉开多条线程,多条线程能够并行(相同的时间)推行不一的职分。

1 使用NSThread完毕打地鼠

1.iOS的三种多线程技巧

1.NSThread每一个NSThread对象对应多个线程,量级较轻(真正的多线程)

2.之下两点是苹果特意开辟的“并发”技能,使得程序猿能够不再去关切线程的切切实实使用难题,更加多应用POSIX

(1)NSOperation/NSOperationQueue面向对象的线程技能

(2)GCD —— Grand Central Dispatch(中心派发) 是基于C语言的框架(也许是pthread),能够充足利用多核,是苹果推荐应用的二十多线程技艺

如上这两种编制程序格局从上到下,抽象度等级次序是从低到高的,抽象度越高的采纳越轻松,也是Apple最推荐使用的,在类型中众多框架本事分别采纳了不一样二十四线程本领。

2.两种多线程技巧的相比较

•NSThread:

–优点:NSThread 比其他四个轻量级,使用容易

–弱点:须要和谐解和管理理线程的生命周期、线程同步、加锁、睡眠以及提示等。线程同步对数码的加锁会有一定的体系开采

•NSOperation:

–没有供给关爱线程管理,数据同步的事情,能够把精力放在本身必要施行的操作上

–NSOperation是面向对象的

•GCD:

–Grand Central Dispatch是由苹果支付的一个多核编制程序的消除方案。iOS4.0 技巧动用,是顶替NSThread, NSOperation的迅猛和强硬的技巧

–GCD是基于C语言的

3.二种四线程技巧的完结

3.1. NSThread的多线程本事,

1> 类方法直接展开后台线程,并试行选取器方法

detachNewThreadSelector

韦德国际1946,// 新建三个线程,调用@selector方法2  [NSThread detachNewThreadSelector:@selector(bigDemo) toTarget:self withObject:nil];

2> 成员方法,在实例化线程对象之后,要求运用start试行选择器方法

initWithTarget

// 成员方法

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

// 启动start线程

[thread start];

对此NSThread的简要利用,能够用NSObject的performSelectorInBackground代替

// performSelectorInBackground是将big德姆o的任务放在后台线程中施行 [self performSelectorInBackground:@selector(bigDemo) withObject:nil];

而且,在NSThread调用的情势中,同样要运用autoreleasepool进行内部存款和储蓄器处理,不然轻松出现内部存款和储蓄器走漏。

// 自动释放池 

// 担负其余线程上的内存管理,在使用NSThread恐怕NSObject的线程方法时,供给求选取机动释放池 

// 不然轻松出现内部存款和储蓄器走漏。 

@autoreleasepool {  }

3.2 NSOperation,面向对象的二十多线程手艺

1> 使用手续:

1) 实例化操作

// 实例化操作队列

 _queue = [[NSOperationQueue alloc] init];

a) NSInvocationOperation

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction) object:nil];

// 假设使用start,会在此时此刻线程运行操作

//    

[op1 start];

// 1. 假诺将操作增多到操作队列,操作就能运营

[_queue addOperation:op1];

b) NSBlockOperation

#pragma mark 模仿下载互连网图像 

- (IBAction)operationDemo:(id)sender  { 

// 1. 下载

NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ 

NSLog(@"下载 %@" , [NSThread currentThread]); 

}];

// 2. 滤镜

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"滤镜 %@" , [NSThread currentThread]);

}];

// 3. 显示

NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

         NSLog(@"更新UI %@" , [NSThread currentThread]);

     }];

// 增多操作之间的借助关系,所谓“信赖”关系,就是等待前三个任务成功后,后四个职务能力运转

// 正视关系得以跨线程队列完结

// 提示:在钦赐依赖关系时,注意不要循环重视,不然不办事。

[op2 addDependency:op1];

[op3 addDependency:op2];

[op1 addDependency:op3];

[_queue addOperation:op1];

[_queue addOperation:op2];

[[NSOperationQueue mainQueue] addOperation:op3];

}

2) 将操作加多到行列NSOperationQueue就能够运维二十十二线程施行

 [_queue addOperation:op1];

 [_queue addOperation:op2];

2> 更新UI使用主线程队列

//两方式

[NSOpeationQueue mainQueue] addOperation ^{

};

[[NSOperationQueue mainQueue] addOperation:op3];

3> 操作队列的set马克斯ConcurrentOperationCount

能够安装同期出现的线程数量!

// 调节同一时候最大出现的线程数量

[_queue setMaxConcurrentOperationCount:2];

提醒:此意义独有NSOperation有!

4> 使用addDependency能够安装职务的实行先后顺序,同期能够跨操作队列钦定依赖关系

// 加多操作之间的依赖关系,所谓“依赖”关系,就是等待前七个职务成功后,后叁个职责本事运维

// 正视关系得以跨线程队列达成

// 提示:在钦定倚重关系时,注意不要循环正视,不然不干活。

[op2 addDependency:op1];

[op3 addDependency:op2];

[op1 addDependency:op3];

提拔:在钦命重视关系时,注意不要循环依赖,不然不坐班。

3.3. GCD,C语言

GCD就是为着在“多核”上接纳多线程技术

1> 要使用GCD,全体的点子都是dispatch开始的

2> 名词解释

global全局

queue队列

async异步

sync同步

3> 要实行异步的职责,就在大局队列中施行就可以

dispatch_async 异步实行调控不住先后顺序

4> 关于GCD的队列

全局队列dispatch_get_global_queue

参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT

始终是 0

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

可同步 可异步

串行队列

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

是创造猎取的,不能够间接获得

只得同步

主队列dispatch_get_main_queue

dispatch_async(dispatch_get_main_queue(), ^{

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

});

只可以同歩

5> 异步和一块与形式名无关,与运作所在的行列有关!

一道首要用来支配方法的被调用的顺序

1.线程的相互:
 并行即同时执行。比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C)

1.1 问题

NSThread是ios提供的轻量级的二十三二十四线程消除方案,然则急需团结管理线程的生命周期、线程同步等。本案例使用NSThread落成一个打地鼠的小游戏,在分界面随机发生mouse(承接至UIButton),以及点击mouse消失得分等功用,如图-1所示:

韦德国际1946 1

图-1

2.三十二线程并发推行的原理:
 a. 在同一时间里,CPU只能处理 1 条线程,只有 1 条线程在工作(执行)
 b. 多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换),如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象

1.2 方案

先是创制二个SingleViewApplication应用,在该使用中开创三个TRMouse地鼠类,由于地鼠具备一些击成效,因此TRMouse类承接至UIButton。

辅助在TRMouse的早先化方法中校背景设置为革命,标题设置为3,并增添点击事件本地鼠出现在分界面三分钟之内被点击即未有得分。

地鼠出现三分钟未有被点击则自动消失,所以TRMouse类中需求接纳detachNewThreadSelector:toTarget:withObject:方法开二个线程用于计时,每隔一秒调用一回refresh方法,地鼠的标题举行三、二、一倒计时展现,最终从分界面消失。

接下来在Storyboard的光景中拖放多个Label分别用于显示有功的计数和挫败的计数,并波及成ViewController的输出口属性successLabel和failLabel。

当成功点击地蛇时成功计数加一,地鼠自动消失退步计数加一,该意义能够由此信托协议来兑现,在TRMouse类中定义八个TRMouseDelegate协议,该协议有三个索要贯彻的秘诀-(void)changeScoreWithSuccess:(BOOL)isSuccess。再在TRMouse类中定义八个当众的性质id<TRMouseDelegate>delegate,用于钦定委托对象。在功成名就点击地鼠消失方法中delegate调用changeScoreWithSuccess:方法isSuccess参数字传送入YES,在地鼠自动消失的情势delegate调用changeScoreWithSuccess:方法isSuccess参数字传送入NO。

最终在ViewController类的viewDidLoad方法中张开三个线程,用于定期调用addMouse方法爆发地鼠对象,然后回到主线程将产生的地鼠对象加多到界面。

ViewController类遵循TRMouseDelegate协议,在创设TRMouse对象时将delegate内定为ViewController。ViewController完成changeScoreWithSuccess:方法,依照isSucces参数修改successLabel和failLabel的显示内容。

3.优缺点

3.1优点

 a. 能适当提高程序的执行效率
 b. 能适当提高资源利用率(CPU、内存利用率)

3.2缺点

 a. 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能
 b. 线程越多,CPU在调度线程上的开销就越大
 c. 程序设计更加复杂:比如线程之间的通信、多线程的数据共享

1.3 步骤

达成此案例须要依据如下步骤进行。

步骤一:创制地鼠类TRMouse

率先成立八个SingleViewApplication应用,在该利用中开创一个TRMouse地鼠类,由于地鼠具备一些击作用,因而TRMouse类承接至UIButton,如图-2所示:

韦德国际1946 2

图-2

其次在TRMouse的开端化方法少将背景设置为棕黄,标题设置为3,并增添点击事件本地鼠现身在分界面三分钟之内被点击即未有,代码如下所示:

 

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
count = 3;
self.backgroundColor = [UIColorredColor];
[selfsetTitle:[NSStringstringWithFormat:@"%d",count] forState:UIControlStateNormal];
[selfaddTarget:self action:@selector(clicked) forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
实现clicked方法,代码如下所示:


- (void)clicked {
[selfremoveFromSuperview];
self.tag = 1;
}
地鼠出现三秒钟没有被点击则自动消失,所以TRMouse类中需要使用detachNewThreadSelector:toTarget:withObject:方法开一个线程用于计时,每隔一秒调用一次refresh方法,地鼠的标题进行三、二、一倒计时显示,最后从界面消失,代码如下所示:


- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
count = 3;
self.backgroundColor = [UIColorredColor];
[selfsetTitle:[NSStringstringWithFormat:@"%d",count] forState:UIControlStateNormal];
[selfaddTarget:self action:@selector(clicked) forControlEvents:UIControlEventTouchUpInside];
}
[NSThreaddetachNewThreadSelector:@selector(refresh) toTarget:selfwithObject:nil];
return self;
}
//实现refresh方法
- (void)refresh {
for(inti=0;i<4;i  ) {
[selfperformSelectorOnMainThread:@selector(mouseDisapear) withObject:nilwaitUntilDone:NO];
[NSThread sleepForTimeInterval:1];
}
}
//实现mouseDisappear方法
-(void)mouseDisapear {
self.titleLabel.text =[NSStringstringWithFormat:@"%d",count];
NSLog(@"count = %d",count);
if (count==0&&self.tag!=1) {
[selfremoveFromSuperview];
}
count--;
}
步骤二:添加成功标签和失败标签

首先在Storyboard的场景中拖放两个Label分别用于显示成功的计数和失败的计数,并关联成ViewController的输出口属性successLabel和failLabel,代码如下所示:

@interfaceViewController ()
@property (weak, nonatomic) IBOutletUILabel *successLabel;
@property (weak, nonatomic) IBOutletUILabel *failLabel;
@end
当成功点击地鼠时成功计数加一,地鼠自动消失失败计数加一,该功能可以通过委托协议来实现,在TRMouse类中定义一个TRMouseDelegate协议,该协议有一个需要实现的方法-(void)changeScoreWithSuccess:(BOOL)isSuccess,代码如下所示:

@protocolTRMouseDelegate
-(void)changeScoreWithSuccess:(BOOL)isSuccess;
@end
再在TRMouse类中定义一个公开的属性id<TRMouseDelegate>delegate,用于指定委托对象,代码如下所示:


@interfaceTRMouse : UIButton
@property (nonatomic,assign) id<TRMouseDelegate> delegate;
@end
最后在成功点击地鼠消失方法中delegate调用changeScoreWithSuccess:方法isSuccess参数传入YES,在地鼠自动消失的方法delegate调用changeScoreWithSuccess:方法isSuccess参数传入NO,代码如下所示:

//成功点击
- (void)clicked {
[selfremoveFromSuperview];
self.tag = 1;
[self.delegatechangeScoreWithSuccess:YES];
}
//失败自动消失
-(void)mouseDisapear {
self.titleLabel.text =[NSStringstringWithFormat:@"%d",count];
NSLog(@"count = %d",count);
if (count==0&&self.tag!=1) {
[selfremoveFromSuperview];
[self.delegatechangeScoreWithSuccess:NO];
}
count--;
}
步骤三:搭建界面

首先在ViewController类的viewDidLoad方法中开启一个线程,用于定时调用addMouse方法产生地鼠对象,然后返回主线程将产生的地鼠对象添加到界面,代码如下所示:

- (void)viewDidLoad {
[superviewDidLoad];
[NSThreaddetachNewThreadSelector:@selector(addMouse) toTarget:selfwithObject:nil];
}
- (void)addMouse {
for (inti=0;;i  ) {
[NSThread sleepForTimeInterval:1];
[selfperformSelectorOnMainThread:@selector(addMouseView) withObject:nilwaitUntilDone:NO];
}
}
- (void)addMouseView {
CGSizescreenSize = [[UIScreenmainScreen]bounds].size;
TRMouse *mouse = [[TRMousealloc]initWithFrame:CGRectMake(arc4random()%(int)(screenSize.width-30), 50 arc4random()%(int)(screenSize.height-80), 30, 30)];
[self.viewaddSubview:mouse];
}
然后ViewController类遵守TRMouseDelegate协议,在创建TRMouse对象时将delegate指定为ViewController,代码如下所示:


- (void)addMouseView {
CGSizescreenSize = [[UIScreenmainScreen]bounds].size;
TRMouse *mouse = [[TRMousealloc]initWithFrame:CGRectMake(arc4random()%(int)(screenSize.width-30), 50 arc4random()%(int)(screenSize.height-80), 30, 30)];
mouse.delegate = self;
[self.viewaddSubview:mouse];
}
最后ViewController实现changeScoreWithSuccess:方法,根据isSucces参数修改successLabel和failLabel的显示内容:


-(void)changeScoreWithSuccess:(BOOL)isSuccess {
switch ((int)isSuccess) {
case 0:{
int count = [self.failLabel.textintValue];
self.failLabel.text = [NSStringstringWithFormat:@"%d",  count];
}
break;
case 1:{
int count = [self.successLabel.textintValue];
self.successLabel.text = [NSStringstringWithFormat:@"%d",  count];
}
}
}
1.4 完整代码

本案例中,ViewController.m文件中的完整代码如下所示:


#import "ViewController.h"
@interfaceViewController () <TRMouseDelegate>
@property (weak, nonatomic) IBOutletUILabel *successLabel;
@property (weak, nonatomic) IBOutletUILabel *failLabel;
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
[NSThreaddetachNewThreadSelector:@selector(addMouse) toTarget:selfwithObject:nil];
}
- (void)addMouse {
for (inti=0;;i  ) {
[NSThread sleepForTimeInterval:1];
[selfperformSelectorOnMainThread:@selector(addMouseView) withObject:nilwaitUntilDone:NO];
}
}
- (void)addMouseView {
CGSizescreenSize = [[UIScreenmainScreen]bounds].size;
TRMouse *mouse = [[TRMousealloc]initWithFrame:CGRectMake(arc4random()%(int)(screenSize.width-30), 50 arc4random()%(int)(screenSize.height-80), 30, 30)];
mouse.delegate = self;
[self.viewaddSubview:mouse];
}
-(void)changeScoreWithSuccess:(BOOL)isSuccess {
switch ((int)isSuccess) {
case 0:{
int count = [self.failLabel.textintValue];
self.failLabel.text = [NSStringstringWithFormat:@"%d",  count];
}
break;
case 1:{
int count = [self.successLabel.textintValue];
self.successLabel.text = [NSStringstringWithFormat:@"%d",  count];
}
}
}
@end

本案例中,TRMouse.h文件中的完整代码如下所示:


#import<UIKit/UIKit.h>
@protocolTRMouseDelegate
-(void)changeScoreWithSuccess:(BOOL)isSuccess;
@end
@interfaceTRMouse : UIButton
@property (nonatomic,assign) id<TRMouseDelegate> delegate;
@end

本案例中,TRMouse.m文件中的完整代码如下所示:


#import "TRMouse.h"
@interfaceTRMouse (){
int count;
}
@end
@implementationTRMouse
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
count = 3;
self.backgroundColor = [UIColorredColor];
[selfsetTitle:[NSStringstringWithFormat:@"%d",count] forState:UIControlStateNormal];
[selfaddTarget:self action:@selector(clicked) forControlEvents:UIControlEventTouchUpInside];
}
[NSThreaddetachNewThreadSelector:@selector(refresh) toTarget:selfwithObject:nil];
return self;
}
- (void)clicked {
[selfremoveFromSuperview];
self.tag = 1;
[self.delegatechangeScoreWithSuccess:YES];
}
- (void)refresh {
for(inti=0;i<4;i  ) {
[selfperformSelectorOnMainThread:@selector(mouseDisapear) withObject:nilwaitUntilDone:NO];
[NSThread sleepForTimeInterval:1];
}
}
-(void)mouseDisapear {
self.titleLabel.text =[NSStringstringWithFormat:@"%d",count];
NSLog(@"count = %d",count);
if (count==0&&self.tag!=1) {
[selfremoveFromSuperview];
[self.delegatechangeScoreWithSuccess:NO];
}
count--;
}
@end

 

4.多线程在ios中的应用

4.1主线程

 a. 一个iOS程序运行后,默认会开启 1 条线程,称为“主线程”或“UI 线程”
 b. 作用:刷新显示 UI,处理 UI 事件

4.2子线程

 a. 除了主线程之外的所有线程,也叫做后台线程
 b. 子线程不能用来刷新 UI

注意:

 a. 不要将耗时操作放到主线程中去处理,因为会卡住线程,造成画面卡顿的现象
 b. 和UI相关的刷新操作必须放到主线程中进行处理
5.三十二线程安全隐患
  • 能源分享
1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源
比如多个线程访问同一个对象、同一个变量、同一个文件
  • 当多少个线程访谈同一块财富时,很轻松吸引多少错乱和数目安全难题
安全隐患解决– 互斥锁
  • 互斥锁使用格式
// 注意:锁定1份代码只用1把锁,用多把锁是无效的
@synchronized(锁对象){ //需要锁定的代码  }
  • 互斥锁的利害
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
  • 互斥锁的选用前提:
多条线程抢夺同一块资源
  • 线程同步: 多条线程在平等条线上实施(按顺序地实施职责)
互斥锁,就是使用了线程同步技术
6.线程间通信
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另1个线程继续执行任务

本文由韦德国际1946发布于韦德国际1946,转载请注明出处:线程基础及NSThread,线程操作之NSThread

关键词: 日记本 iOS Dev...

上一篇:windows品质监视器,7能源监视器
下一篇:没有了