标签:多线程
程序:由源代码生成的可执行应用。(例如:QQ.app)
进程:一个正在运行的程序可以看做?个进程。(例如:正在运?的QQ就是一个进程),进程拥有独?立运?行所需的全部资源。
线程:程序中独?立运?行的代码段。(例如:接收QQ消息的代码)
一个进程是由一或多个线程组成。进程只负责资源的调度和分配,
线程才是程序真正的执?行单元,负责代码的执?行。
进程是分配资源的最小单位,线程是执行的最小单位
死锁 :根本原因,内存分配不当。
单线程
每个正在运?行的程序(即进程),至少包含一个线程,这个线程叫主线程。
主线程在程序启动时被创建,?于执行main函数。
只有?个主线程的程序,称作单线程程序。
主线程负责执?行程序的所有代码(UI展现以及刷新,??网络请求,本 地存储等等)。这些代码只能顺序执?行,无法并发执?。
多线程
拥有多个线程的程序,称作多线程程序。
iOS允许用户自?己开辟新的线程,相对于主线程来讲,这些线程,称 作?线程。可以根据需要开辟若干子线程
子线程和主线程是都是独?立的运?行单元,各?自的执?行互不影响,因此能够并发执?行。
主线程和子线程
主线程 number = 1;name = main;
线程分为两种:终极线程和非终极线程
终极线程:任务完成以后,子线程自动销毁
非终极线程:任务完成以后子线程不会自动销毁
线程的四种实现方式
1、NSObject 自带的 background 执行
2、NSThread
3、NSOperationQueue 和 NSOperation
4、GCD
// 子线程里面必须手动添加 autoreleasepool
实现 calculateNumber 方法
一般线程方法
- (void)xianchengfangfa
{
// 获取当前线程
NSThread *current = [NSThread currentThread];
// 给线程发送通知,停止线程
[current cancel];
// 直接结束线程
[NSThread exit];
}
NSObject 实现多线程(终极线程)
// 1、NSObject 实现多线程(终极线程)
- (void)NSObject1
{
// 隐式开辟了一个线程
[self performSelectorInBackground:@selector(calculateNumber) withObject:nil];
}
NSThread 实现多线程(两种方式)(终极线程)
方式 <1>
// 2、NSThread 实现多线程(两种方式)(终极线程)
// 方式 <1>
- (void)NSThread1
{
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(calculateNumber) object:nil];
// 开始执行任务
[thread start];
NSLog(@”#####%@ %d”, [NSThread currentThread], [NSThread isMainThread]);
}
方式 <2>
// 方式 <2>
- (void)NSThread2
{
[NSThread detachNewThreadSelector:@selector(calculateNumber) toTarget:self withObject:nil];
}
NSOperationQueue 和 NSOperation 实现多线程
// 3、NSOperationQueue 和 NSOperation 实现多线程
// 他们两个本身都不是线程
// NSOperation:任务块
// NSOperation:任务队列,一个任务队列里面可以存放很多个任务快
// 任务块放到任务队列里面,系统自动隐式开辟线程
- (void)NSOperationQueue1
{
// 创建任务块 两种方式
// 根据任务数量,CPU和内存使用情况,去开辟数量合适的线程
// <1>
// 创建 Operation
NSInvocationOperation *ope1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(calculateNumber) object:nil];
// <2>
NSBlockOperation *ope2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”I am NSBlockOperation”);
}];
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 设置队列线程最大开辟数量
queue.maxConcurrentOperationCount = 5;
// 把任务块添加到队列
[queue addOperation:ope1];
[queue addOperation:ope2];
// 主队列 主队列里面一般情况,任务都有主线程执行
// [NSOperationQueue mainQueue];
}
版权声明:本文为outlan原创文章,未经博主允许不得转载。
标签:多线程
原文地址:http://blog.csdn.net/yadong_zhao/article/details/47133247