iOS NSThread 初体验

iOS有三种多线程编程技术:

(1)NSThread

(2)NSOperation

(3)GCD

三者的抽象程度由低到高,抽象越高越简单,也是苹果最推荐使用的

对于NSThread,其优缺点如下:

优点:NSThread 比其他两个轻量级

缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销


下面通过一段代码进行说明:

#import "HXViewController.h"

@interface HXViewController ()
{
    NSInteger tickets;
    NSThread *Thread_Seller_1;
    NSThread *Thread_Seller_2;
}

@end

@implementation HXViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	tickets = 10;
    Thread_Seller_1 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTicket) object:nil];
    [Thread_Seller_1 setName:@"Thread-1"];
    [Thread_Seller_1 start];
    
    Thread_Seller_2 = [[NSThread alloc] initWithTarget:self selector:@selector(sellTicket) object:nil];
    [Thread_Seller_2 setName:@"Thread-2"];
    [Thread_Seller_2 start];
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)sellTicket
{
    while(TRUE) {
        @synchronized(self)
        {
            if (tickets >= 0) {
                [NSThread sleepForTimeInterval:0.5];
                NSLog(@"当前票剩余:%d,售卖者:%@\n", tickets, [[NSThread currentThread] name]);
                tickets --;
            }
            else {
                break;
            }
        }
    }
}

@end

几点值得注意的:

(1)NSThread声明:有两种方法

[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil]; 

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]; 
[myThread start]; 
第一个方法一经调用会立即创建一个线程来做事情;而后一种通过定义实例对象,需要调用对象的start方法来启动线程

(2)由于apple不允许在主线程以外的线程中对UI进行操作,所以在子线程中如果有更新UI的需求,使用如下方法:

[self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];
(3)使用NSThread需要自己对线程同步进行管理,主要体现在数据同步上,多个线程如果对同一数据进行操作,很有可能造成数据不同步的错误,所以上面给出的示例代码在对tickets进行操作前,使用了@synchronized(self),目的在于:创建一个互斥锁,保证此时没有其他线程对self对象进行修改,即同时只能有一个线程对tickets变量进行操作。





你可能感兴趣的:(iOS NSThread 初体验)