Men的博客

欢迎光临!

0%

NSThread

什么是NSThread?

NSThread 是ios提供的操作和使用线程的一个类
线程:
进程:理解,活着的程序,是程序执行的一个操作系统实体

NSThread的创建线程

//每个线程执行对应一个方法
NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(thread1:) object:nil];
//启动线程
[thread1 start];

//以类方法创建线程
// [NSThread detachNewThreadSelector:@selector(dealThread2:) toTarget:self withObject:nil];
//可以实现同时执行的效果,以前都是先执行A后执行B,现在有了多线程,可以实现同时执行

为什么要实行线程

//UI界面中如果直接执行耗时任务的,界面会卡死,为了能让界面执行耗时任务的时候继续反应,使用新的线程去执行耗时任务
//应用场合:下载网络文件,同时执行多个任务,加载大文件,加载大数据
//3.为什么要实行线程
UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
button.frame=CGRectMake(100, 100, 100, 30);
[button setTitle:@”耗时任务” forState:UIControlStateNormal];
[self.view addSubview:button];
[button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
-(void)btnClick:(UIButton *)button
{
//暂停5秒
// [NSThread sleepForTimeInterval:5];
// [self dealThread2:nil];
// 如果直接执行的话UI界面会卡死,没有反应
//开启一个新的线程执行
[NSThread detachNewThreadSelector:@selector(dealThread2:) toTarget:self withObject:nil];

}

//4.监控线程的执行完成
//如何知道那个线程执行接收,使用block–以后要学
//4.监控线程的执行完成
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealThreadExit:) name:NSThreadWillExitNotification object:nil];
-(void)dealThreadExit:(NSNotification *)no
{
NSLog(@”线程执行完成”);
NSLog(@”ui=%@”,no.userInfo);
}
//5.线程的控制,线程同步
//遇到情况:多个线程访问同一块数据
//如何解决:
//a+10 1.先从内存拿出,修改,再放回去
//访问数据的时候加锁
//5.线程的控制,线程同步
_lock=[[NSLock alloc]init];

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

[self setAddBlock:^(NSString *mmm){
NSLog(@”hbbbgeregour====%@”,mmm);
}];

#pragma mark - 线程同步
-(void)addFunc:(NSThread *)th
{
for(int i=0;i<1000;i++)
{
//加锁
[_lock lock];
_num++;
[NSThread sleepForTimeInterval:0.001];
//减锁
[_lock unlock];

}
NSLog(@"add num=%d",_num);
if (self.addBlock)
{
    self.addBlock(@"add");
}

}
-(void)subFunc
{
for(int i=0;i<1000;i++)
{
//加锁
// [_lock lock];
_num–;
[NSThread sleepForTimeInterval:0.001];
//减锁
// [_lock unlock];

}
NSLog(@"sub num=%d",_num);

}

//6.UI主线程如何操作UI?
//ui主线程,
// 工作子线程
// 注意:不要在子线程中直接操作UI,交给主线程UI;
[self howToUpDateUIInSubThread];
-(void)howToUpDateUIInSubThread
{
_progress =[[UIProgressView alloc]initWithFrame:CGRectMake(10, 200, 300, 20)];
[self.view addSubview:_progress];
//添加一个按钮
UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
button.frame=CGRectMake(100, 300, 100, 30);
[button setTitle:@”下载文件” forState:UIControlStateNormal];
[self.view addSubview:button];
[button addTarget:self action:@selector(startDownloadClick:) forControlEvents:UIControlEventTouchUpInside];
}
-(void)startDownloadClick:(UIButton *)button
{
[NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];
}
-(void)download:(NSThread )thread
{
for(int i=0;i<1000;i++)
{
//更新UI
// _progress.progress+=0.01;
//在主线程中执行一个方法
[self performSelectorOnMainThread:@selector(upDateUI) withObject:nil waitUntilDone:NO];
[NSThread sleepForTimeInterval:0.001];
NSLog(@”进度为%f%%”,_progress.progress
100);
}
}
-(void)upDateUI
{
_progress.progress+=0.001;
}