iOS多线程的创建

- (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);

    }

}


你可能感兴趣的:(iOS多线程的创建)