IOS 多线程之 NSThread
2016-01-17 17:16 000aaa 阅读(351) 评论(0) 编辑 收藏 举报线程概述
有些程序是一条直线,起点到终点——如简单的hello world,运行打印完,它的生命周期便结束了,像是昙花一现。
有些程序是一个圆,不断循环直到将它切断——如操作系统,一直运行直到你关机。
一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。
Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程。主线成在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的操作必须在主线程进行。
系统中每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则公用进程的内存空间。
1.什么是进程?
进程:最直观的就是一个个pid,进程是程序在计算机上的一次执行活动。从main函数开始到main函数的return结束!
(由此可见:大部分的app都只有一个main函数,也就是单进程应用!!!)
2.什么是线程?
一个进程中至少有一个线程(主线程),创建一个新的线程就是给进程增加一个执行流,(就像一条河流,在主干道向多出一个分流这样主干道的任务量就减少了!!)
3.为什么要用多线程有什么好处?
在一些任务量比较大的情况下,主线程中处理需要花费比较多得时间(这样UI界面会很不流畅)可以开启子线程 让这些任务有子线程在后台来处理,处理完了回到主线程中更新UI 就可以了
iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞
(举个例子:一个坐汽车的工厂,他需要的各种配件,自己坐起来耗费时间周期比较长,这样就直接让其他的配件公司去做,它只用等做好了用就可以了)
4.多线程应用场景。
异步请求,下载图片,如果执行一项任务需要多个步骤,每一步都需要等待上一步的结果,这样就处理起来很耗时可以同时开启多个线程 让每一步在一个线程中执行 这样可以减少等待的时间等等!!!
下面介绍NSThread iOS开发中的应用
1.创建一个线程
//实例方法创建一个线程 ---- 需要手动的开始执行线程 NSThread * thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(firstThread:) object:nil]; // 设置线程的优先级(0.0 ~ 1.0,1.0是最高级) thread1.threadPriority = 0.7; // 开启线程 [thread1 start]; -(void)firstThread:(NSThread *)sender { NSLog(@"firstThread"); }
// 调用完毕后,会马上创建并开启新线程----静态创建 [NSThread detachNewThreadSelector:@selector(secondThread:) toTarget:self withObject:nil]; -(void)secondThread:(NSThread *)sender { NSLog(@"secondThread"); }
//隐式创建一个线程 [self performSelectorInBackground:@selector(thirdThread:) withObject:nil]; -(void)thirdThread:(NSThread *)sender { NSLog(@"thirdThread"); }
2.获取主线程和当前正在执行任务的线程
//获取主线程 NSThread *mainThread = [NSThread mainThread];
//获取当前正在执行任务的线程 NSThread *currentThread = [NSThread currentThread];
3.让线程停止几秒钟后在执行
//获取当前正在执行任务的线程 NSThread *currentThread = [NSThread currentThread]; //让当前执行任务的线程 停止2s后在继续执行 注意非必要的情况下不允许让主线程停止,不然界面会被卡住 [NSThread sleepForTimeInterval:2]; /* NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date]; */
4.线程间的跳转执行
//回主线程 [self performSelectorOnMainThread:@selector(runOnMainThread) withObject:nil waitUntilDone:YES]; //回到当前线程中去执行相应的任务 [self performSelector:@selector(run) withObject:nil]; //回到指定的线程中去执行相应的任务 [self performSelector:@selector(run) onThread:oneThread withObject:nil waitUntilDone:YES];
5.NSThread 和NSOperationQueue GCD 相比之下的优缺点
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
文章到此就结束啦,希望对路过的朋友有所帮助!!!