iOS之多线程编程:三个层次线程应用
2012-08-31 09:22
453 查看
iOS支持三个层次的线程编程,从底层到高层(层次越高使用越方便,越简洁)分别是:
1:Thread;
2:Cocoa Operations;
3:Grand Central Dispatch;
简介:
Thread是抽象层次最低的,另外两种线程应用给予thread进行了封装,对于程序员而言,thread相对麻烦,需要程序员管理线程周期,但是效率最高。thread包含两种:Cocoa
threads——使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程;POSIX threads: 基于 C 语言的一个多线程库。
创建NSThread的方式有三种:
一:[NSThread detachNewThreadSelector:@selector(myThreadMethod:) toTarget:self withObject:nil]; 调用立即创建一个新线程执行操作
二:NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMethod:)
object:nil]; [myThread start]; NSThread初始化之后,新的线程并没有执行,而是调用
start 时才会创建线程执行。这种方法相对上面的方法更加灵活,在启动新的线程之前,对线程进行相应的操作,比如设置优先级,加锁。
三:[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil];
利用 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程:
以上都可以在新的线程中调用performSelectorOnMainThread:
withObject:waitUntilDone:更新UI,因为子线程不能直接更新UI。
线程同步与锁:
有很多时候多个线程之间会访问相同的数据,如何避免a线程和b线程之间的冲突,以及执行顺序等需要程序员考虑,这个时候需要用到NSCondition,NSLock,确保线程(原子操作)安全。
用NSCodition同步执行的顺序,NSCodition
是一种特殊类型的锁,我们可以用它来同步操作执行的顺序。它与 mutex 的区别在于更加精准,等待某个 NSCondtion 的线程一直被 lock,直到其他线程给那个 condition 发送了信号。下面我们来看使用示例:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tickets = 100;
count = 0;
ticketCondition = [[NSCondition
alloc] init]; // 锁对象
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
[ticketsCondition lock]; // 上锁
if(tickets > 0){
[NSThread sleepForTimeInterval:0.5];
count = 100 - tickets;
NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);
tickets--;
} else {
break;
}
[ticketsCondition unlock];
}
}
线程间通信,交互
在应用程序主线程中做事情:
performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:
在指定线程中做事情:
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:
在当前线程中做事情:
performSelector:withObject:afterDelay:
performSelector:withObject:afterDelay:inModes:
取消发送给当前线程的某个消息
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget:selector:object:
Cocoa Operetions
1:Thread;
2:Cocoa Operations;
3:Grand Central Dispatch;
简介:
Thread是抽象层次最低的,另外两种线程应用给予thread进行了封装,对于程序员而言,thread相对麻烦,需要程序员管理线程周期,但是效率最高。thread包含两种:Cocoa
threads——使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程;POSIX threads: 基于 C 语言的一个多线程库。
创建NSThread的方式有三种:
一:[NSThread detachNewThreadSelector:@selector(myThreadMethod:) toTarget:self withObject:nil]; 调用立即创建一个新线程执行操作
二:NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMethod:)
object:nil]; [myThread start]; NSThread初始化之后,新的线程并没有执行,而是调用
start 时才会创建线程执行。这种方法相对上面的方法更加灵活,在启动新的线程之前,对线程进行相应的操作,比如设置优先级,加锁。
三:[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil];
利用 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程:
以上都可以在新的线程中调用performSelectorOnMainThread:
withObject:waitUntilDone:更新UI,因为子线程不能直接更新UI。
线程同步与锁:
有很多时候多个线程之间会访问相同的数据,如何避免a线程和b线程之间的冲突,以及执行顺序等需要程序员考虑,这个时候需要用到NSCondition,NSLock,确保线程(原子操作)安全。
用NSCodition同步执行的顺序,NSCodition
是一种特殊类型的锁,我们可以用它来同步操作执行的顺序。它与 mutex 的区别在于更加精准,等待某个 NSCondtion 的线程一直被 lock,直到其他线程给那个 condition 发送了信号。下面我们来看使用示例:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tickets = 100;
count = 0;
ticketCondition = [[NSCondition
alloc] init]; // 锁对象
ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadone setName:@"Thread-1"];
[ticketsThreadone start];
ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
[ticketsThreadtwo setName:@"Thread-2"];
[ticketsThreadtwo start];
[window makeKeyAndVisible];
}
- (void)run{
while (TRUE) {
[ticketsCondition lock]; // 上锁
if(tickets > 0){
[NSThread sleepForTimeInterval:0.5];
count = 100 - tickets;
NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);
tickets--;
} else {
break;
}
[ticketsCondition unlock];
}
}
线程间通信,交互
在应用程序主线程中做事情:
performSelectorOnMainThread:withObject:waitUntilDone:
performSelectorOnMainThread:withObject:waitUntilDone:modes:
在指定线程中做事情:
performSelector:onThread:withObject:waitUntilDone:
performSelector:onThread:withObject:waitUntilDone:modes:
在当前线程中做事情:
performSelector:withObject:afterDelay:
performSelector:withObject:afterDelay:inModes:
取消发送给当前线程的某个消息
cancelPreviousPerformRequestsWithTarget:
cancelPreviousPerformRequestsWithTarget:selector:object:
Cocoa Operetions
相关文章推荐
- iOS之多线程编程:三个层次线程应用
- iOS之多线程编程:三个层次线程应用
- iOS之多线程编程:三个层次线程应用
- iOS之多线程编程:三个层次线程应用
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
- 多线程编程指南之线程管理(iOS,Mac os )
- iOS-多线程编程学习之pthread创建线程(二)
- 多线程编程题目:使用三个线程有序输出“1,2,3,1,2,3。。。”,其中线程1只输出1,线程2只输出2,线程3只输出3
- iOS多线程编程之三——GCD的应用
- 理解iOS多线程应用的开发以及线程的创建方法
- 迅雷面试题 多线程编程,开启三个线程每个线程输出一个字符
- iOS多线程编程——线程锁的使用
- 题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕打印10次ABC
- 多线程编程——信号量的第二种应用_允许有限的线程同时访问临界资源
- 有三个线程ID分别是ABC,用多线程编程在屏幕上循环打印ABCABC....十次
- 进程与线程,java多线程的应用
- 关于多线程编程您不知道的 5 件事 有关高性能线程处理的微妙之处
- (转载)Posix多线程编程—线程属性
- Java多线程编程总结笔记——一多线程基础知识
- 在web开发中的三个层次使用事务(C#编程)(转)