iOS开发多线程篇NSThread

示意图.png

1、优缺点

1.优点:NSThread比其他两种多线程方案较轻量级,更直观地控制线程对象
2.缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

2、 NSThread相关的主要方法:

创建、启动线程

  // 线程一启动,就会在线程thread中执行self的run方法

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start];

创建线程后自动启动线程

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

隐式创建并启动线程

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

3、互斥锁

@synchronized(锁对象) { // 需要锁定的代码 }

互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源

互斥锁的使用前提:多条线程抢夺同一块资源

4、线程间通信

线程间通信常用方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

5、模拟一个卖票系统

self.tickets = 100;//总共票数

NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
thread1.name = @"售票机1";
[thread1 start];

NSThread *thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
thread2.name = @"售票机2";
[thread2 start];



- (void)run {

    if (_lock == nil)
    {
        _lock = [[NSLock alloc] init];
    }

    while (YES)
    {
        [_lock lock];
        if (_tickets > 0)
        {
            _tickets -= 1;
            NSString *message = [NSString stringWithFormat:@"当前票数是%ld,售票线程是%@",(long)_tickets,[[NSThread currentThread] name]];

            NSLog(@"message == %@",message);
        
            [_lock unlock];
        
            if ([[[NSThread currentThread] name] isEqualToString:@"售票机1"])
            {
                [NSThread sleepForTimeInterval:0.2];
            }
            else
                [NSThread sleepForTimeInterval:0.3];
        }
        else
        {
            [_lock unlock];
            break;
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 上篇我们学习了iOS多线程解决方式中的NSOperation,这篇我主要概况总结iOS多线程中NSThread的解...
    码代码的小马阅读 3,188评论 0 0
  • .一.进程 进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空...
    IIronMan阅读 9,985评论 1 33
  • 我是个感性的人!即使失去了十年的爱情;经历了离婚;我依然相信爱情;相信自己会有幸福! 老天是眷顾我的!让我在浮华的...
    静宸宸阅读 2,972评论 1 2
  • 虽然很难过,但你我终究是匆匆流年里的过客。
    帅帅的小新阅读 1,333评论 0 0
  • 今天是2017.2.28,离西域男孩解散已经有六年多的时间了,那个曾囊括无数大奖,打破无数记录的爱尔兰乐队,那群让...
    乔笛阅读 6,215评论 56 36

友情链接更多精彩内容