多线程

程序:由源代码生成的可执行应用。(例如: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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值