标签:
多线程技术
process进程:在系统中运行的一个应用程序;每个进程都是独立的;有专有的内存空间
thread线程:程序的一段执行序列,进程的不部分;
特点:1、进程只分配内存空间,并不执行任务
2、每个进程至少有一个线程,该线程叫做主线程
3、线程是进程的基本执行单元,进程的所有任务都是在线程中执行
4、每个线程中得任务的执行都是串行的
多线程并发:一个进程中多条线程并发执行任务;
特点: 1、提高程序的执行效率,提高资源利用率
2、同一时间,CPU只能处理一条线程
3、多线程并发时,CPU在多条线程间快速切换
4、线程切换的 速度很快,就造成了多线程的并发执行
5、开启线程需要内存空间,线程太多会造成调度消耗太多资源
6、线程过多会降低每条线程被调度的频率(线程执行效率降低)
多线程的应用:
主线程:显示刷新UI界面、处理UI事件;耗时任务(如下载)放在子线程中
判定方法在哪个线程中执行:NSLog(@“当前的线程:”,[NSThread currentThread]);
四种多线程技术:pthread NSThread
pthread:
基于c语言的API ,可编写多平台应用,使用难度大,需要手动创建销毁线程,可自定义功能少
pthread_t pthread;
void *task(void *data){
NSLog(@“当前子线程:%@“,NSThread currentThread];
return 0;
}
pthread_create(&pthread,NULL,task,NULL);
NSThread:
基于OC,相对于pthread使用简单,面向对象
缺点:需要自己管理线程的生命周期,线程同步,加锁、开锁,管理多个线程比较困难
手动创建线程的三种方法:
1、NSThread实例方法:- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument NS_AVAILABLE(10_5, 2_0);(只创建)
2、NSThread类方法:+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument; (创建并运行)
3、NSThread实例方法:- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg NS_AVAILABLE(10_5, 2_0);
注:selector: 线程执行的方法,这个selector只能由一个参数,而且没有返回值
object: 传给target的唯一参数,也可以为nil
target: selector消息发送的对象 只有第一个能设置名字、优先级
线程阻塞:
// sleep?法?:开始睡眠5秒钟
[NSThread sleepForTimeInterval:5];
// sleep?法二:
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3
[NSThread sleepUntilDate:date];
强制停止线程:
[NSThread exit];
其他常用方法:
+(NSThread *)mainThread; //获得主线程
-(BOOL)isMainThread;//判断是否是主线程
+(double)threadPriority;//获取线程优先级 优先级取值范围0.0~1.0 值越大优先级越高
+(BOOL)setThreadPriority:(double)p;//设置优先级
-(NSString*)name;//获取线程名字
-(void)setName:(NSString*)n;//设置线程名字
线程的状态:
New(新建) -> Runnable(就绪) --> cpu开始调度当前线程 ---> Running(运行) ---> 调用 sleep方法 ---> Blocked(阻塞) ---> 移除线程池 ---> sleep执行完毕/到时 ---> 进入线程 池 ---> Runnable(就绪)
如果线程任务执行完毕/异常/强制退出 ---> Dead(死亡)
加锁:
尽量避免使用@synchronized,也就是避免多个线程访问同一个资源,因为有了加锁、 解锁需要消耗比较大的cpu资源
加锁的前提:多个线程同时访问同一个资源的时候才需要加锁(互斥锁)
线程同步:多条线程在同一条线上执行(按顺序地执行任务)
尽量讲加锁、资源抢夺的业务逻辑交割服务器端处理,减少移动客户端的压力
synchronized关键字
1、synchronized关键字的作用域有二种:
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的 synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){},它的作用域是当前对象;
原子和非原子属性:
nonatomic: 非原子 —> 不会在set方法中加锁,这个是推荐方式,会占用资源少
atomic:原子 —> 在set方法中加锁,防止多个线程同时执行set方法
线程间的通讯:
1.在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
2.线程间通讯的方式:
一个线程传递数据给另一个线程
在一个线程中执行完特定任务后,转到另一个线程继续执行任务
iOS多线程技术---pthread、NSThread、NSOperationQueue、GCD
标签:
原文地址:http://www.cnblogs.com/ChrisYu/p/4649968.html