多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美。这篇文章主要从线程创建与启动、线程的同步与锁、线程的交互、线程池等等四个方面简单的讲解一下iphone中的多线程编程。  
一、线程创建与启动  
线程创建主要有二种方式:  
当然,还有一种比较特殊,就是使用所谓的convenient method,这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。这个方法的接口是:   
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument  
前两种方法创建后,需要手机启动,启动的方法是:  
- (void)start;  
二、线程的同步与锁  
要说明线程的同步与锁,最好的例子可能就是多个窗口同时售票的售票系统了。我们知道在java中,使用synchronized来同步,而iphone虽然没有提供类似java下的synchronized关键字,但提供了NSCondition对象接口。查看NSCondition的接口说明可以看出,NSCondition是iphone下的锁对象,所以我们可以使用NSCondition实现iphone中的线程安全。这是来源于网上的一个例子:  
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(@"当前票数是:%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];  
}  
如果你什么都不考虑,在线程函数内调用 autorelease 、那么会出现下面的错误:  
.NSAutoReleaseNoPool(): Object 0x********* of class NSConreteData autoreleased with no pool in place ….  
四、关于线程池,大家可以查看NSOperation的相关资料。

objective-c中是如何实现线程同步的?的更多相关文章

  1. C#中的几个线程同步对象方法

    在编写多线程程序时无可避免会遇到线程的同步问题.什么是线程的同步呢? 举个例子:如果在一个公司里面有一个变量记录某人T的工资count=100,有两个主管A和B(即工作线程)在早一些时候拿了这个变量的 ...

  2. .NET中的异步操作及线程同步

    执行异步操作 CLR使用了WIN的线程处理能力,但保留了与其分离的权利.某些时候CLR的线程与Win的线程不是完全的匹配. 线程的系统开销较大,应限制其数量. 创建:分配并初始化一线程内核对象,保留1 ...

  3. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  4. .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

    你可以使用临界区(Critical Section).互斥量(Mutex).信号量(Semaphores)和事件(Event)来处理线程同步.然而,在编写一些异步处理函数,尤其是还有 async 和 ...

  5. selenium grid中的多个线程同步执行

    需求:有一个工作流,每一步审批都需要多个领导参与,才能推流程到下一步去 代码思考:多个领导在自己的线程中运行,速度有的快有的慢,如何保证下一步的领导审批时,这个步骤已经激活 如下是代码:思路为:如果这 ...

  6. 编写高质量代码改善C#程序的157个建议——建议72:在线程同步中使用信号量

    建议72:在线程同步中使用信号量 所谓线程同步,就是多个线程在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样 ...

  7. Java中线程同步的理解

    我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源, ...

  8. 改善C#程序的建议6:在线程同步中使用信号量

    原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两 ...

  9. java中线程同步的理解(非常通俗易懂)

    转载至:https://blog.csdn.net/u012179540/article/details/40685207 Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运 ...

随机推荐

  1. yarn环境的搭建

    1.首先,在zookeeper搭建成功,服务运行的基础上搭建yarn,其次,保证时间一致 2.在 /home/install/hadoop-2.5/etc/hadoop目录下配置一下几个配置文件: 第 ...

  2. Java笔记(一)……概述

    一.Java是什么 Java是SUN(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级编程语言. 二.Java的发展简史 在20世纪90年代初,Su ...

  3. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》

    4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验.游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意.开发者在开发游戏初期,会根据 ...

  4. linux定时器HZ和Jiffies

    1.linux HZ Linux核心几个重要跟时间有关的名词或变数,以下将介绍HZ.tick与jiffies. HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),H ...

  5. Script.NET Perl解释器代码已经在GitHub开源发布

    Script.NET Perl解释器的代码已经提交到GitHub网站.GitHub项目地址: https://github.com/blueantst/Script.NET Perl解释器代码在Src ...

  6. oc学习之路----QQ聊天界面

    用到的技术:自定义cell,通知机制,代理模式 transform 1.自定义cell(通过代码自定义cell) ①首先新建一个类继承UITableViewCell ②重写initWithStyle: ...

  7. ASP.NET MVC- JSON ,Jquery, State management and Asynch controllers

    一.JSON  MVC And JQuery In case you are new to JSON please read this before moving ahead with this la ...

  8. 【Android - 基础】之Animator属性动画

    1      概述 在3.0系统之前,Android给我们提供了逐帧动画Frame Animation和补间动画Tween Animation两种动画: 1)        逐帧动画的原理很简单,就是 ...

  9. Script Form

    Script Form 是SAP所提供的一款强大的报表设设计工具. 一.Script Form主要工具包括如下: 1)Form Painter:格式绘制器,用于格式的设定.TCoce:SE71. 2) ...

  10. asp.net C#母版页和内容页事件排版载入顺序生命周期

    asp.net C#母版页和内容页事件排版载入顺序生命周期 关于ASP页面Page_Load发生在事件之前而导致的问题已经喜闻乐见,对于问题的解释也非常全面.可是怎样解决这个问题则较少有人说明,我就再 ...