与时俱进的IT

UI(三十一)多线程-NSThread

2018-07-30  本文已影响0人  社会主义顶梁鹿

一、线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B。为了同时执行两个任务,产生了多线程。

 二、进程

 1、进程就是操作系统中运行的程序,专业点说进程是应用程序的执行实例

 2、进程不能执行任务

 3、进程在运行时创建的资源随着进程的终止而死亡

 三、线程

 1、进程本身是不执行任务的

 2、线程执行完毕就会被销毁

 3、主线程:当应用程序启动时自动创建和启动,通常用来处理用户的输入并响应各种事件和消息,主线程的终止也意味着该程序的结束。

 4、子线程:由主线程来创建,用来帮助主线程的后台处理任务。如果子线程A中创建了一个子线程B,在创建之后,这两者就是相互独立的。多个子线程之间效果上可以执行。

 5、一个进程可以有多个线程,并且所有线程都在该进程的虚拟地址空间中,可以使用进程的全局变量和系统资源。

 6、线程的五种状态:

 四、多线程 

 1、同一时间内,CPU只能处理一条线程

#pragma mark ***NSThread开辟线程的两种方式***

 加载一张图片

 1、创建一个UIImageView并放在父视图上

 2、创建一个子线程

 3、通过URL获取网络图片

 4、回到主线程

 5、在主线程更新UI

#pragma mark---创建手动开启方式---

 //第三个参数object是方法选择器选择方法的方式

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

 //开启线程

[thread start];

#pragma mark---创建自动开启方式---

    [NSThreaddetachNewThreadSelector:@selector(thread1:) toTarget:self withObject:@"thread1"];

 NSLog(@"ViewDidLoad方法所在的线程%@",[NSThread currentThread]);

 imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];

    [self.view addSubview:imageView];

#pragma mark---在子线程执行的方法---

- (void)thread1:(NSString *)sender{

 NSThread *thread = [NSThread currentThread];

    thread.name = @"我是子线程";

 //[NSThread currentThread]获取到当前所在的信息

 NSLog(@"Thread1方法所在的线程%@",[NSThread currentThread]);

 //[NSThread isMainThread]判断当前是否主线程

 BOOL isMainThread = [NSThread isMainThread];

 NSLog(@"%d",isMainThread);

 //[NSThread isMultiThreaded]判断当前线程是否多线程

 BOOL isMultiThreaded = [NSThread isMultiThreaded];

 NSLog(@"%d",isMultiThreaded);

 //setThreadPriority 设置线程的优先级

    [NSThread setThreadPriority:1.0];

 //sleepForTimeInterval 设置线程休眠几秒

    [NSThread sleepForTimeInterval:2];

 //从网络上加载图片并将它转化为data类型的数据

 NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kUrl]];

 image = [UIImage imageWithData:data];

 //waitUntilDone设为YES 意味着UI更新完才会去做其他操作

    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

}

- (void)updateUI:(UIImage *)kimage{

 imageView.image = kimage;

 NSLog(@"updateUI所在的线程是%@",[NSThread currentThread]);

}

上一篇 下一篇

猜你喜欢

热点阅读