多线程NSThread

import “AppDelegate.h”

@interface AppDelegate ()

// 定义车票的数量
@property (nonatomic , assign) NSInteger tickets;

// 定义一把锁
@property (nonatomic , retain ) NSLock *lock;

@end

@implementation AppDelegate

  • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    // 创建子线程的三种方式
    // 1.NSThread
    // 2.NSOperationQueue
    // 3.NSObject的分类方法

    // 子线程中是没有自动释放池的

//
// NSLog(@”%@” , [NSThread currentThread]);

// 用NSThread创建一条子线程

// [NSThread detachNewThreadSelector:@selector(test1:) toTarget:self withObject:@”类方法创建的子线程”];

// 用实例方法创建一条子线程

// NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(test1:) object:@”实例方法创建子线程”];
// thread1.name = @”子线程1”;
// [thread1 start];

// 用NSOperationQueue创建用来添加任务的队列

// NSOperationQueue *queue = [[NSOperationQueue alloc] init];

// 用NSOperation创建任务

// NSOperation *operation1 = [[NSOperation alloc] init];

// NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation1Action:) object:@”任务1”];
//
// NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation2Action:) object:@”任务2”];
//
// NSInvocationOperation *operation3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation3Action:) object:@”任务3”];

// 添加两条任务之间的依赖关系

// [operation2 addDependency:operation1];

// 给任务队列设置并发数

// [queue setMaxConcurrentOperationCount:1];

// 给队列里面添加任务

// [queue addOperation:operation1];
// [queue addOperation:operation2];
// [queue addOperation:operation3];

// 运用NSObject的分类创建子线程

// [self performSelectorInBackground:@selector(backgroundAction:) withObject:@”后台任务”];

// 将NSOperation 任务添加到任务队列中,有队列对所有的任务合理地分配线程和资源
// 队列为每一个任务合理的分配一个子线程
// 因为队列是先进先出,所以分配任务的时候也是有先后顺序的,但是所有任务的执行都是同时执行的(即线程并发)
// 线程同步:线程之间存在依赖关系,后一个线程的执行必须依赖于前一个任务的结束
 // 线程并发:线程与线程之间不存在依赖关系,同时执行,可能后分配线程的任务先完成
// 任务队列:会为每一个任务分配一个合理的线程,任务队列创建线程的数量是有系统的性能决定的,但是能够保证所有的任务均在子线程中完成

// 把 锁 创建出来
self.lock = [[NSLock alloc ]init];
// 初始化车站 一共有20张票
self.tickets = 20;

// 第一条子线程  --  贝爷
[NSThread detachNewThreadSelector:@selector(sellTickets:) toTarget:self withObject:@"贝爷"];


// 第二条子线程  --  博博
[NSThread detachNewThreadSelector:@selector(sellTickets:) toTarget:self withObject:@"博博"];






return YES;

}

// 两条线程同时执行selltickets方法
// 线程互斥:当多个线程同时访问同一个资源的时候,为了保证访问安全,一个线程访问的时候,其他线程处于等待状态
// 线程死锁:当线程访问一个资源的时候,如果该资源已经被其他线程正在访问(已加锁) , 如果想要使用该资源,必须等待其他线程完毕,而如果没有解锁的话,线程将长期处于等待状态
// 网络中的同步连接和异步连接:是属于连接方式的,请求线程不同

// 同步连接网络请求:是有主线程处理的,而异步连接是由子线程处理的

// 线程中的同步和并发:是属于多线程之间的关系

// 线程同步:各线程执行的任务之间存在依赖关系,后一个线程开始执行任务必须等待前一个线程执行任务结束

/// 线程并发:线程同时执行任务.线程任务之间没有依赖关系,可能后执行的任务的线程先完成任务

// 主线程和子线程都可以线程同步
// 但是只有子线程能够实现线程并发

  • (void)sellTickets:(NSString *)name
    {
    while (YES) {
    // 枷锁
    [self.lock lock];

    if (self.tickets > 0) {
        self.tickets--;
        NSLog(@"%@  , 剩余票数: %ld" , name , self.tickets);
    } else {
        NSLog(@"票卖完了");
        break;
    }
    // 解锁
    [self.lock unlock];
    

    }
    }

  • (void)backgroundAction:(NSString *)name
    {
    NSLog(@”%@ -> %@” , name , [NSThread currentThread]);

    NSLog(@”后台任务执行完成”);

    // 调回主线程中执行任务
    [self performSelectorOnMainThread:@selector(mainAction:) withObject:@”主线程任务” waitUntilDone:YES];

}

  • (void)mainAction:(NSString *)name
    {
    NSLog(@”%@ -> %@” , name , [NSThread currentThread]);

    NSLog(@”又回到主线程中开始执行任务了”);
    }

// 任务1执行的方法
- (void)operation1Action:(NSString *)name
{
NSLog(@”%@” , name);

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(action) userInfo:nil repeats:YES];

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop run];

}

// 任务而执行的方法
- (void)operation2Action:(NSString *)name
{
NSLog(@”%@” , name);

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(action) userInfo:nil repeats:YES];

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop run];

}

// 任务3执行的方法
- (void)operation3Action:(NSString *)name
{
NSLog(@”%@” , name);
}

// 子线程要执行的方法
- (void)test1:(NSString *)name
{

// [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(action) userInfo:nil repeats:YES];

NSLog(@"子线程  %@" , [NSThread currentThread]);
NSLog(@"%@" , name);

// 在子线程中添加定时器的时候,一定要启动runloop事件 , 定时器才会起作用

// 主线程在UIApplicationMain函数中,已经开启了runloop时间循环,所以说,主线程能够及时捕获操作,及时处理,
// 但是在子线程中默认是没有开启runloop的

// NSRunLoop *runloop = [NSRunLoop currentRunLoop];
// [runloop run];

}

  • (void)action
    {
    NSLog(@”lanou is a big company”);
    }
这里写代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值