zoukankan      html  css  js  c++  java
  • iOS多线程

     iPhone 中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB。并且该值不能通过编译器开关或线程API函数来更改。

      只有主线程有直接修改UI的能力。

    一、 NSOperation和NSOperationQueue

      1、一个继承自  NSOperation的操作类,该类的实现中必须有 - (void)main方法的。

      2、使用NSOperation的最简单方法就是将其放入NSOperationQueue中。

        一旦一个操作被加入队列,该队列就会启动并开始处理它(即调用该操作类的main方法)。一旦该操作完成队列就会释放它。

         self.queue = [[NSOperationQueue alloc] init];

          ArticleParseOperation *parser = [[ArticleParseOperation alloc] initWithData:filePath delegate:self];

          [queue addOperation:parser];

          [parser release];

         [queue release];

      3、可以给操作队列设置最多同事运行的操作数: [queue setMaxConcurrentOperationCount:2];

    二、NSThread<转>

    一、线程创建与启动
    线程创建主要有二种方式:

    - (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

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

    - (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的相关资料。

    原帖: http://www.voland.com.cn/iphone-in-the-multi-threaded-programming

  • 相关阅读:
    HAproxy 1.5 dev14 发布
    IBM/DW 使用 Java 测试网络连通性的几种方法
    Skype 4.1 Linux 发布,支持微软帐号登录
    Dorado 7.1.20 发布,Ajax的Web开发平台
    Aspose.Slides for Java 3.0 发布
    开发版本 Wine 1.5.18 发布
    BitNami Rubystack 开始支持 Ruby 2.0
    XWiki 4.3 正式版发布
    Silverlight实例教程 Out of Browser的Debug和Notifications窗口
    Silverlight实例教程 Out of Browser与Office的互操作
  • 原文地址:https://www.cnblogs.com/zhulin/p/2102793.html
Copyright © 2011-2022 走看看