- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//第一种创建线程的方式
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(mutableThread:) object:@"第一种创建线程的方式"];
[thread start];//启动线程
//第二种创建线程的方式
//创建并执行线程
[NSThread detachNewThreadSelector:@selector(mutableThread:) toTarget:self withObject:@"第二种创建线程的方式"];
//第三种创建线程的方式(NSObject带的方法)
[self performSelectorInBackground:@selector(mutableThread:) withObject:@"第三种创建线程的方式"];
//并行编程的方式创建线程
//并行编程技术分类为:Operation Queue 和 GCD(Grand Central Dispatch),GCD包括:Dispatch Queue 和Dispatch Source
//第四种创建线程的方式
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
//会开启一个多线程,调用block
[operationQueue addOperationWithBlock:^{
NSLog(@"第四种创建线程的方式");
}];
//第五种创建线程的方式
//线程池,线程队列,操作队列,用于管理线程,可以控制并发数,优先级
//线程池的创建
NSOperationQueue *operationQueue2 = [[NSOperationQueue alloc] init];
//设置线程池并发数
//如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多就开多一点,内存少就开少一点。
//最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡
operationQueue2.maxConcurrentOperationCount = 1;
//线程的创建
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1:) object:@"第五种创建线程的方式,第一个线程"];
//设置线程的优先级,优先级高的任务,调用的几率会更大。
[operation1 setQueuePriority:NSOperationQueuePriorityVeryLow];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1:) object:@"第五种创建线程的方式,第二个线程"];
//设置线程的优先级,优先级高的任务,调用的几率会更大。
[operation2 setQueuePriority:NSOperationQueuePriorityVeryLow];
NSInvocationOperation *operation3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(thread1:) object:@"第五种创建线程的方式,第三个线程"];
//设置线程的优先级
[operation3 setQueuePriority:NSOperationQueuePriorityVeryHigh];
//设置依赖
// [operation1 addDependency:operation2];
//将创建的线程添加到线程池中
// [operationQueue2 addOperation:operation1];
// [operationQueue2 addOperation:operation2];
// [operationQueue2 addOperation:operation3];
[operationQueue2 addOperations:@[operation1,operation3] waitUntilFinished:NO];
NSLog(@"------");
//第六种创建线程的方式GCD方式
//创建一个队列,串行队列
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
//创建异步线程
dispatch_async(queue, ^{
//多线程
NSLog(@"第六种创建线程的方式-多线程");
//回到主线程执行
dispatch_sync(dispatch_get_main_queue(), ^{
//主线程
NSLog(@"第六种创建线程的方式-主线程");
});
});
return YES;
}
- (void)mutableThread:(NSString *)data {
NSLog(@"%@ is called! %@",NSStringFromSelector(_cmd),data);
//waitUntilDone:YES:表示等updateUI执行完才能往下执行
[self performSelectorOnMainThread:@selector(updateUI:) withObject:@"update UI" waitUntilDone:YES];
}
- (void)updateUI:(NSString *)data {
NSLog(@"%@ is called! %@",NSStringFromSelector(_cmd),data);
BOOL isMainThread = [NSThread isMainThread];
if (isMainThread) {
NSLog(@"是主线程");
}
}
- (void)thread1:(NSString *)data {
NSLog(@"%@ is called! %@",NSStringFromSelector(_cmd),data);
// NSLog(@"thread name=%@",[NSThread currentThread].name);
BOOL isMultiThread = [NSThread isMultiThreaded];
if (isMultiThread) {
NSLog(@"是多线程");
}
// for (int i = 0; i < 50; i++) {
// NSLog(@"thread1:%d",i);
// }
}
- (void)thread2:(NSString *)data {
NSLog(@"%@ is called! %@",NSStringFromSelector(_cmd),data);
for (int i = 0; i < 50; i++) {
NSLog(@"thread2:%d",i);
}
}