解析iphone多線程
不管是iphone中還是其他的操作系統(tǒng),多線程在各種編程語言中都是難點,很多語言中實現(xiàn)起來很麻煩,objective-c雖然源于c,但其多線程編程卻相當簡單,可以與java相媲美。多線程編程是防止主線程堵塞,增加運行效率等等的最佳方法。而原始的多線程方法存在很多的毛病,包括線程鎖死等。
一、線程創(chuàng)建與啟動
線程創(chuàng)建主要有二種方式:
- (id)init; // designated initializer
 - (id)initWithTarget:(id)target selector:
 - (SEL)selector object:(id)argument;
 
當然,還有一種比較特殊,就是使用所謂的convenient method,這個方法可以直接生成一個線程并啟動它,而且無需為線程的清理負責。這個方法的接口是:
- (void)detachNewThreadSelector:
 - (SEL)aSelector toTarget:
 - (id)aTarget withObject:
 - (id)anArgument
 
前兩種方法創(chuàng)建后,需要手機啟動,啟動的方法是:
- (void)start;
 
二、線程的同步與鎖
要說明線程的同步與鎖,最好的例子可能就是多個窗口同時售票的售票系統(tǒng)了。我們知道在java中,使用synchronized來同步,而iphone雖然沒有提供類似java下的synchronized關鍵字,但提供了NSCondition對象接口。查看NSCondition的接口說明可以看出,NSCondition是iphone下的鎖對象,所以我們可以使用NSCondition實現(xiàn)iphone中的線程安全。這是來源于網(wǎng)上的一個例子:
SellTicketsAppDelegate.h 文件
- // SellTicketsAppDelegate.h
 - import <UIKit/UIKit.h>
 - @interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {
 - int tickets;
 - int count;
 - NSThread* ticketsThreadone;
 - NSThread* ticketsThreadtwo;
 - NSCondition* ticketsCondition;
 - UIWindow *window;
 - }
 - @property (nonatomic, retain) IBOutlet UIWindow *window;
 - @end
 - SellTicketsAppDelegate.m 文件
 - // SellTicketsAppDelegate.m
 - import "SellTicketsAppDelegate.h"
 - @implementation SellTicketsAppDelegate
 - @synthesize window;
 - - (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];
 - //[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
 - // Override point for customization after application launch
 - [window makeKeyAndVisible];
 - }
 - - (void)run{
 - while (TRUE) {
 - // 上鎖
 - [ticketsCondition lock];
 - if(tickets > 0){
 - [NSThread sleepForTimeInterval:0.5];
 - count = 100 - tickets;
 - NSLog(@"當前票數(shù)是:%d,售出:%d,線程名:%@",tickets,count,[[NSThread currentThread] name]);
 - tickets--;
 - }else{
 - break;
 - }
 - [ticketsCondition unlock];
 - }
 - }
 - - (void)dealloc {
 - [ticketsThreadone release];
 - [ticketsThreadtwo release];
 - [ticketsCondition release];
 - [window release];
 - [super dealloc];
 - }
 - @end
 
三、線程的交互
線程在運行過程中,可能需要與其它線程進行通信,如在主線程中修改界面等等,可以使用如下接口:
- (void)performSelectorOnMainThread:
 - (SEL)aSelector withObject:
 - (id)arg waitUntilDone:
 - (BOOL)wait
 
由于在本過程中,可能需要釋放一些資源,則需要使用NSAutoreleasePool來進行管理,如:
- (void)startTheBackgroundJob {
 - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 - // to do something in your thread job
 - ...
 - [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];
 - [pool release];
 - }
 
小結:
對于多線程,在一個程序中,一些獨立運行的程序片斷叫作線程,利用它編程的概念就叫作多線程處理。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然后程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以后才開始響應
【編輯推薦】
蘋果發(fā)布iPhone OS 4 Beta 4和SDK















 
 
 

 
 
 
 