[self performSelectorInBackground:@selector(try:) withObject:para1];
[NSThread detachNewThreadSelector:@selector(try:) toTarget:self withObject:para1]
NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]; //start thread manually [myThread start];
为了防止内存泄露,如果你使用的是内存管理模型(即含有retain、release操作)你应该在try中添加autoreleasepool,像main函数中做的那样:
-(void)try:(id)para1{ @autoreleasepool{ /*do something here*/ } }
你调用后台线程时,也应该这么做,这两种方式并没有实质性的区别。如果你使用的是垃圾回收机制(ARC),那么创建的自动释放池会被忽略,但它是无害的。
如果你创建了多个Thread实例,你可以通过:
performSelector:onThread:withObject:waitUntilDone:
- (NSUInteger)stackSize NS_AVAILABLE(10_5, 2_0); - (void)setStackSize:(NSUInteger)s NS_AVAILABLE(10_5, 2_0); + (NSArray *)callStackReturnAddresses NS_AVAILABLE(10_5, 2_0); + (NSArray *)callStackSymbols NS_AVAILABLE(10_6, 4_0);
- (NSMutableDictionary *)threadDictionary;
+ (void)sleepUntilDate:(NSDate *)date; + (void)sleepForTimeInterval:(NSTimeInterval)ti;
- (void)cancel NS_AVAILABLE(10_5, 2_0); - (void)start NS_AVAILABLE(10_5, 2_0); + (void)exit;
查询线程的状态:
- (BOOL)isExecuting NS_AVAILABLE(10_5, 2_0); - (BOOL)isFinished NS_AVAILABLE(10_5, 2_0); - (BOOL)isCancelled NS_AVAILABLE(10_5, 2_0);
在默认的情况下,创建的新线程的优先级与当前线程是相同的。内核调度算法在决定该运行那个线程时,会把线程的优先级作为考量因素,较高优先级的线程会比较低优先级的线程具有更多的运行机会。你可以通过:
//class method + (double)threadPriority; + (BOOL)setThreadPriority:(double)p; //instance method - (double)threadPriority NS_AVAILABLE(10_6, 4_0); - (void)setThreadPriority:(double)p NS_AVAILABLE(10_6, 4_0);
来设置线程的优先级。
重要:让你的线程处于默认优先级值是一个不错的选择。增加某些线程的优先级,同时有可能增加了某些较低优先级线程的饥饿程度。如果你的应用程序包含较高优先级和较低优先级线程,而且它们之间必须交互,那么较低优先级的饥饿状态有可能阻塞其他线程,并造成性能瓶颈。