码迷,mamicode.com
首页 > 编程语言 > 详细

多线程

时间:2015-07-29 21:25:10      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:多线程

程序:由源代码生成的可执行应用。(例如:QQ.app) 
进程:一个正在运行的程序可以看做?个进程。(例如:正在运?的QQ就是一个进程),进程拥有独?立运?行所需的全部资源。
线程:程序中独?立运?行的代码段。(例如:接收QQ消息的代码)
 一个进程是由一或多个线程组成。进程只负责资源的调度和分配,
线程才是程序真正的执?行单元,负责代码的执?行。
进程是分配资源的最小单位,线程是执行的最小单位

死锁 :根本原因,内存分配不当。

单线程
每个正在运?行的程序(即进程),至少包含一个线程,这个线程叫主线程。
主线程在程序启动时被创建,?于执行main函数。
只有?个主线程的程序,称作单线程程序。
主线程负责执?行程序的所有代码(UI展现以及刷新,??网络请求,本 地存储等等)。这些代码只能顺序执?行,无法并发执?。

多线程
拥有多个线程的程序,称作多线程程序。
iOS允许用户自?己开辟新的线程,相对于主线程来讲,这些线程,称 作?线程。可以根据需要开辟若干子线程
子线程和主线程是都是独?立的运?行单元,各?自的执?行互不影响,因此能够并发执?行。

主线程和子线程

主线程 number = 1;name = main;

线程分为两种:终极线程和非终极线程
终极线程:任务完成以后,子线程自动销毁
非终极线程:任务完成以后子线程不会自动销毁

线程的四种实现方式
1、NSObject 自带的 background 执行
2、NSThread
3、NSOperationQueue 和 NSOperation
4、GCD

// 子线程里面必须手动添加 autoreleasepool

实现 calculateNumber 方法

pragma mark 实现 calculateNumber 方法

  • (void)calculateNumber
    {
    for (int i = 0; i < 6; i++) {
    printf(“%d\n”,i);
    }
    NSLog(@”%@ %d”, [NSThread currentThread], [NSThread isMainThread]);
    }

一般线程方法
- (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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!