解析iphone多线程

移动开发 iOS
这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。

不管是iphone中还是其他的操作系统,多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美。多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。

一、线程创建与启动

线程创建主要有二种方式:

 

  1. (id)init; // designated initializer  
  2. (id)initWithTarget:(id)target selector:  
  3. (SEL)selector object:(id)argument; 

当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:

  1. (void)detachNewThreadSelector:  
  2. (SEL)aSelector toTarget:  
  3. (id)aTarget withObject:  
  4. (id)anArgument 

前两种方法创建后,需要手机启动,启动的方法是:

  1. (void)start; 

二、线程的同步与锁

要说明线程的同步与锁,最好的例子可能就是多个窗口同时售票的售票系统了。我们知道在java中,使用synchronized来同步,而iphone虽然没有提供类似java下的synchronized关键字,但提供了NSCondition对象接口。查看NSCondition的接口说明可以看出,NSCondition是iphone下的锁对象,所以我们可以使用NSCondition实现iphone中的线程安全。这是来源于网上的一个例子:

SellTicketsAppDelegate.h 文件

  1. // SellTicketsAppDelegate.h  
  2. import <UIKit/UIKit.h> 
  3. @interface SellTicketsAppDelegate : NSObject <UIApplicationDelegate> {  
  4.      int tickets;  
  5.      int count;  
  6.      NSThread* ticketsThreadone;  
  7.      NSThread* ticketsThreadtwo;  
  8.      NSCondition* ticketsCondition;  
  9.      UIWindow *window;  
  10. }  
  11. @property (nonatomic, retain) IBOutlet UIWindow *window;  
  12. @end  
  13. SellTicketsAppDelegate.m 文件  
  14. // SellTicketsAppDelegate.m  
  15. import "SellTicketsAppDelegate.h"  
  16. @implementation SellTicketsAppDelegate  
  17. @synthesize window;  
  18. - (void)applicationDidFinishLaunching:(UIApplication *)application {  
  19.      tickets = 100;  
  20.      count = 0;  
  21.      // 锁对象  
  22.      ticketCondition = [[NSCondition alloc] init];  
  23.      ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  
  24.      [ticketsThreadone setName:@"Thread-1"];  
  25.      [ticketsThreadone start];  
  26.      ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  
  27.      [ticketsThreadtwo setName:@"Thread-2"];  
  28.      [ticketsThreadtwo start];  
  29.      //[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];  
  30.       // Override point for customization after application launch  
  31.      [window makeKeyAndVisible];  
  32.  
  33. }  
  34.  
  35. - (void)run{  
  36.      while (TRUE) {  
  37.      // 上锁  
  38.          [ticketsCondition lock];  
  39.          if(tickets > 0){  
  40.              [NSThread sleepForTimeInterval:0.5];  
  41.              count = 100 - tickets;  
  42.              NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,count,[[NSThread currentThread] name]);  
  43.              tickets--;  
  44.          }else{  
  45.              break;  
  46.          }  
  47.          [ticketsCondition unlock];  
  48.      }  
  49. }  
  50. - (void)dealloc {  
  51. [ticketsThreadone release];  
  52.      [ticketsThreadtwo release];  
  53.      [ticketsCondition release];   
  54.      [window release];  
  55.      [super dealloc];  
  56. }  
  57. @end 

三、线程的交互

线程在运行过程中,可能需要与其它线程进行通信,如在主线程中修改界面等等,可以使用如下接口:

  1. (void)performSelectorOnMainThread:  
  2. (SEL)aSelector withObject:  
  3. (id)arg waitUntilDone:  
  4. (BOOL)wait 

由于在本过程中,可能需要释放一些资源,则需要使用NSAutoreleasePool来进行管理,如:

  1. (void)startTheBackgroundJob {       
  2. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  3.     // to do something in your thread job  
  4.     ...  
  5.     [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO];  
  6.     [pool release];  

小结:

对于多线程,在一个程序中,一些独立运行的程序片断叫作线程,利用它编程的概念就叫作多线程处理。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应

【编辑推荐】

多图详解 iPhone SDK下载安装教程

苹果发布iPhone OS 4 Beta 4和SDK

从零开始 iPhone应用程序开发入门指南

iPhone OS 4.0操作系统 七大特点全面分析

iPhone有效利用 十大iOS免费网管应用程序

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-07-21 11:12:58

iPhone 线程 多线程

2011-07-08 16:43:46

iPhone Cocoa 多线程

2011-06-07 17:35:39

iphone 多线程

2011-08-12 10:09:23

iPhone开发多线程

2011-08-09 14:24:18

iPhone多线程线程

2011-08-08 13:50:29

iPhone开发 NSOperatio 多线程

2013-08-21 16:17:09

iPhone多线程

2011-08-01 12:53:25

iPhone 多线程 线程

2011-08-10 10:18:22

iPhone多线程线程

2009-07-21 17:09:47

ASP.NET多线程

2011-08-19 17:36:42

iPhone操作队列Java

2010-05-24 14:04:48

JavaSwing多线程

2011-06-22 14:30:44

QT 多线程 线程

2010-01-18 18:06:07

VB.NET多线程

2011-04-18 09:22:38

多线程

2011-07-21 15:20:31

iPhone SDK 多线程

2024-02-27 10:44:58

C#线程后端

2011-06-22 14:38:09

QT 多线程 线程安全

2011-06-22 16:18:23

QT 多线程 QSocket

2009-03-12 10:52:43

Java线程多线程
点赞
收藏

51CTO技术栈公众号