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”);
}
这里写代码片