iOS NSThread和线程锁

一、NSThread 多线程的优缺点:

  • 优点:NSThread比NSOperation和GCD轻量级;
  • 缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。

二、NSThread的使用:

1、NSThread有两种直接创建方式:

  • ①、- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument ;
  • ②、+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

例如:

// 这种创建线程⾃自动就运⾏行

(1)、动态创建

NSThread *t2 = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain2:) object:nil];
// 设置线程的优先级(0.0 - 1.0,1.0最高级)
t2.threadPriority = 1;
[t2 start];

(2)、静态创建

[NSThread detachNewThreadSelector:@selector(threadMain0:) toTarget:self withObject:@"111"];
- (void)threadMain0:(NSString *)obj{
    NSLog(@"obj = %@",obj); //111
}

2、参数的意思

  • ①、selector:线程执行的方法,这个selector只能有一个参数,而且不能有返回值;

  • ②、target:selector消息发送对象;

  • ③、object:传输给target的唯一参数,也可以为nil。

      第一种方式会直接创建线程并且开始运行线程,第二种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息。
    

3、隐藏式创建

[self performSelectorInBackground:@selector(threadMain3:) withObject:@"333”];

三、NSThread的属性

NSThread* current = [NSThread currentThread];

1、返回当前线程

+ (NSThread *)currentThread;

2、判断是否为多线程

+ (BOOL)isMultiThreaded;

3、暂停

+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

4、退出线程

+ (void)exit;

5、设置线程的优先级(0.0,-1.0,1.0最高)

+ (double)threadPriority;
+ (BOOL)setThreadPriority:(double)p;

6、线程函数地址

+ (NSArray *)callStackReturnAddresses;

7、设置与返回线程名称 设置与返回线程名称

@property (copy) NSString *name;

8、线程堆栈

@property NSUInteger stackSize;

9、 判断当前线程是否为主线程

+ (BOOL)isMainThread NS_AVAILABLE(10_5, 2_0);
+ (NSThread *)mainThread NS_AVAILABLE(10_5, 2_0);

10、是否在执行

@property (readonly, getter=isExecuting) BOOL executing;

11、是否已经结束

@property (readonly, getter=isFinished) BOOL finished;

12、是否取消的

@property (readonly, getter=isCancelled) BOOL cancelled;

13、取消操作

- (void)cancel NS_AVAILABLE(10_5, 2_0);

14、线程启动

- (void)start NS_AVAILABLE(10_5, 2_0);

四、获取当前线程

NSThread* current = [NSThread currentThread];

五、获取主线程

NSThread* current = [NSThread mainThread];

六、暂停当前线程

1、暂停

[NSThread sleepForTimeInterval:2];

2、暂停

NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
[NSThread sleepUntilDate:date]

七、线程间的通信

注意:线程入口函数一旦调用完成后该线程就结束了。

1、在指定线程上执行操作

 [self performSelector:@selector(run) onThread:_myThread withObject:nil waitUntilDone:YES];

2、在主线程执行操作

[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];

3、在当前线程执行操作

[self performSelector:@selector(run) withObject:nil];

八、线程同步

1、NSLock

加锁:

  • ①、- (BOOL)tryLock;
  • ②、- (void)lock;
  • ③、- (BOOL)lockBeforeDate:(NSDate *)limit;

解锁:

  • ①、- (void)unlock;

2、synchornized代替NSLock

@synchronized(self)
{
    // Everything between the braces is protected by the @synchronized directive.
}

@synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

@synchronized 方法控制对类(一般在IOS中用在单例中)的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法锁方能执行,否则所属就会发生线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类,至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突(只要所有可能访问类的方法均被声明为 synchronized)。

synchronized 块:

@通过 synchronized关键字来声明synchronized 块。语法如下:

@synchronized(syncObject) { }

synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

3、NSCondition

NSCodition是一种特殊类型的锁,我们可以用它来同步操作执行的顺序。等待某个NSCondition的线程一直被lock,知道其他线程给那个condition发送了信号。
例如:

- (void)run{
    while (TRUE) {
        // 上锁
        [ticketsCondition lock];
        [ticketsCondition wait];
        //操作
        [ticketsCondition unlock];
    }
}
//其他线程发送信号通知上面的线程,就可以运行了
-(void)run2{
    while (YES) {
        [ticketsCondition lock];
        [NSThread sleepForTimeInterval:3];
        [ticketsCondition signal];
        [ticketsCondition unlock];
    }
}

4、循环锁:NSRecursiveLock

5、条件锁:NSConditionLock

6、分布式锁:NSDistributedLock

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxiaobukuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值