IOS多线程之线程的创建
版权声明:原创作品,谢绝转载!否则将追究法律责任。
之前也说过线程是消耗资源的。多线程会占用你应用程序(和系统的)的内存使用和性能方面的资源。我们创建一个线程后可以对他的一些部分进行配置例如可以对辅助线程分配堆空间的大小。对于创建线程的时间依赖于处理器的负载及其计算速度和可用的系统和程序的空间。
下面介绍创建一个线程所占用的资源:
核心的数据结构:大约1KB 这个内存是用来存储线程的数据结构和属性。
堆栈空间:辅助线程是512KB MacOSX主线程是8MB IOS主线程是1MB 最低允许辅助线程堆栈大小是16 KB并且堆栈大小必须是4 KB的倍数
线程创建的时间:大约90微妙
注意:因为底层内核的支持,操作对象(Operation objectis)可能创建线程更快。它们使用内核里面常驻线程池里面的线程来节省创建的时间,而不是每次都创建新的线程。关于更多使用操作对象(Operation objects)的信息,参阅并发编程指南(Concurrency Programming Guide)。
怎么创建一个线程呢?
创建低级别的线程相对简单。在所有情况下,你必须有一个函数或方法作为线程的主入口点。线程创建使用了这些技术的继承属性的默认设置,由你所使用的技术来决定。更多需要自己配置线程的属性。
使用NSThread
使用NSThread来创建线程有两个可以的方法:
l 使用detachNewThreadSelector:toTarget:withObject:类方法来生成一个新的线程。
[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];
为了生成一个新的线程,你只要简单的提供你想要使用为线程主体入口的方法的名称(被指定为一个selector),和任何你想在启动时传递给线程的数据。
l 创建一个新的NSThread对象,并调用它的start方法。
NSThread* myThread = [[NSThread alloc] initWithTarget:self
selector:@selector(myThreadMainMethod:)
object:nil];
[myThread start]; // Actually create the thread
为了启动一个线程,你可以显式调用对象的start方法
注意:使用initWithTarget:selector:object:方法的替代办法是子类化NSThread,并重写它的main方法。你可以使用你重写的该方法的版本来实现你线程的主体入口。
我们可以给刚才创建的线程发送消息并在多线程上执行selectors
performSelector:onThread:withObject:waitUntilDone:
你使用该技术时所发送的消息会被其他线程作为run-loop主体的一部分直接执行(当然这些意味着目标线程必须在它的run loop里面运行)。当你使用该方法来实现线程通信的时候,你可能仍然需要一个同步操作,但是这比在线程间设置通信端口简单多了。
注意:虽然在线程间的偶尔通信的时候使用该方法很好,但是你不能周期的或频繁的使用performSelector:onThread:withObject:waitUntilDone:来实现线程间的通信。
使用NSObject来生成一个线程
在iOS和Mac OS X v10.5及其之后,所有的对象都可能生成一个新的线程,并用它来执行它任意的方法。方法performSelectorInBackground:withObject:新生成一个的线程,使用指定的方法作为新线程的主体入口点。比如,如果你有一些对象(使用变量myObj来代表),并且这些对象拥有一个你想在后台运行的doSomething的方法,你可以使用如下的代码来生成一个新的线程:
[myObj performSelectorInBackground:@selector(doSomething) withObject:nil];
调用该方法的效果和你在当前对象里面使用NSThread的detachNewThreadSelector:toTarget:withObject:传递selectore,object作为参数的方法一样。新的线程将会被立即生成并运行,它使用默认的设置。在selectore内部,你必须配置线程就像你在任何线程里面一样。比如,你可能需要设置一个自动释放池(如果你没有使用垃圾回收机制),在你要使用它的时候配置线程的run loop。
以上我们是创建线程后需要对他的属性做一些配置下篇我们会具体的介绍。