<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">ios多线程</span>
什么是线程?
很多人会把线程和进程弄混淆, 进程是每个正在运行的程序, 它们都可以看成一个进程, 而线程是是程序中独立运行的代码段, 例如微信的发送消息和接收消息, 它们就是独立运行的代码段.
一个进程中可以包含很多个线程, 最少为一个,建议最大不要超过10个,它们是包含与被包含的关系
那么为什么会有多线程呢?
我是这么理解的,如果把一个进程当做一条公路, 线程就好比是公路上的车道,而我程序执行的代码就是汽车, 如果我们不给它任何的改变,那么它就只有一条车道(我们称之为单线程), 当汽车在车道上行驶时, 只能一辆一辆的通过, 会很影响后面的车辆, 影响整条公路的运行, 而这时我们就需要把公路划分车道, 三车道, 四车道,甚至更多, 这样就能在不影响整条公路的情况下, 提高运行效率
创建线程的几种方式
1.NSThread
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(calculator) object:nil];
[thread start];
[thread release];
[NSThread detachNewThreadSelector:@selector(calculator) toTarget:self withObject:nil];
2.NSObject
<span style="font-size:18px;"> [self performSelectorInBackground:@selector(calculator) withObject:nil];</span>
3. NSOperation 和 NSOperationQueue
MyOperation *operation = [[MyOperation alloc] init];
[operation start];
MyOperation *operation1 = [[MyOperation alloc] init];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 线程并发, 互不干扰同时进行
// 最大并发数为1时, 线程和线程之间是同步的
// 并发 concurrent 同步 serial
queue.maxConcurrentOperationCount = 1;
[queue addOperation:operation];
[queue addOperation:operation1];
[operation release];
[operation1 release];
NSBlockOperation
// block里面的内容就是多线程所要执行的代码
NSBlockOperation *blokOper = [NSBlockOperation blockOperationWithBlock:^{
@autoreleasepool {
for (int i = 0; i < 1000; i++) {
NSLog(@"i = %d", i);
}
}
}];
NSOperationQueue *quene = [[NSOperationQueue alloc] init];
[quene addOperation:blokOper];
[quene release];
4.GCD(现在的创建线程的主要方式, 用起来更简单,更灵活,)
//第一步 创建一个同步线程队列
dispatch_queue_t queue = dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);
// 第二步: 异步执行同步线程队列
dispatch_async(queue, ^{
// 多线程的代码
// 在GCD中没有自动释放池 C语言写的
// 显示到界面上,所有跟UI相关的内容全部都要在主线程运行
// 返回主线程
dispatch_async(dispatch_get_main_queue(), ^{
});
});
//创建一个并行队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
});
});
注意: GCD是ios4.0以后出现的, 并且在所有的进程中都不能修改页面, 必须要返回到主线程才可以, block中为需要实现的功能