多线程

来源:互联网 发布:摄像安卓软件 编辑:程序博客网 时间:2024/06/01 07:24
程序:由源代码生成的可执行应用。(例如: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>

- (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];}
0 0
原创粉丝点击