对于线程和进程的理解

对于线程和进程的理解

前言: 由于最近刚复习了一下线程, 所以将自己的一下理解写下来, 以便自己的记忆, 并分享给大家. 纯属于个人的理解, 有不同见解的可以给我留言啊.

>

首先从进程和线程的定义来入手:
(1) 进程: 进程是资源分配的基本单位(就是一块包含了某些资源的内存区域)
(2) 线程: 线程是CPU独立运行和调度的基本单位(就是进程中执行的一块代码片段)
(3) 所以, 不难看出进程就是线程的容器, 真正完成代码执行的是线程, 而进程则决定了线程的执行环境. 可以这样形象化的理解进程和线程的大致关系: 我把进程理解为一段公路, 线程理解为在公路上行驶的汽车. 这段公路的路况决定了汽车在这段公路上的行驶快慢, 路况好的公路, 汽车的相对速度就会比较快, 相反就会比较慢

>

iOS中的常见的多线程大致分为三类, NSThread, NSOperationQueue, GCD, 下面我就分别写一下这三种多线程的创建方法和大致的用法:

一. NSThread


 - (void)createThreadOne
{

/** 第一种创建方法
* 参数一: 指定target(代理)
* 参数二: 指定selector(方法)
* 参数三: 指定的selector的参数
*/
    NSThread *threadOne = [[NSThread alloc] initWithTarget:self selector:@selector(threadOne:) object:@"第一种创建方法"];
    [threadOne start];
}

- (void)threadOne:(NSString *)string
{
// 利用自动释放池来管理多线程
    @autoreleasepool {
        NSLog(@"参数 = %@", string);
        [self performSelectorOnMainThread:@selector(mainFound:) withObject:@"返回主线程" waitUntilDone:YES];
    }
}




/** 第二种创建方法
* 参数一: 指定selector(方法)
* 参数二: 指定target(代理)
* 参数三: 指定的selector的参数
*/
- (void)createThreadTwo
{
    [NSThread detachNewThreadSelector:@selector(threadTwo:) toTarget:self withObject:@"第二种创建方法"];
}

- (void)threadTwo:(NSString *)string
{
// 利用自动释放池来管理多线程
    @autoreleasepool {
        NSLog(@"参数 = %@", string);

        [self performSelectorOnMainThread:@selector(mainFound:) withObject:@"返回主线程" waitUntilDone:YES];
    }
}



- (void)mainFound:(NSString *)string
{
    // 主线程中在对UI的控件进行赋值, 在多线程中对UI控件会出现赋不上值的情况, 因为, 多线程和主线程不是在同一时间执行的, 这样就会导致, 视图没创建就对视图进行赋值, 但是这时视图是不存在的.
}

二. NSOperationQueue

// NSOperationQueue的创建大致分为两种. 一种是系统中提供了两个继承域NSOption的类, 第二种是自己写一个继承于NSOperation的类

// 1. 系统中提供的类
- (void)createOperationQueue
{
    NSOperationQueue *operation = [[NSOperationQueue alloc] init];
    NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationOfOpreation:) object:@"wohao"];
    [operation addOperation:invocation];


    NSBlockOperation *blockOption = [NSBlockOperation blockOperationWithBlock:^{

        // 写code

    }];

    [operation addOperation:blockOption];


    // 调用自己继承的类
    MyOpreation *myOperation = [[MyOpreation alloc] init];
    [operation addOperation:myOperation];


}


- (void)invocationOfOpreation:(NSString *)string
{
    @autoreleasepool {

        NSLog(@"%@", string);
        // 会到主线程的方法同上
    }
}

// 自定义继承的NSOperation的 .h和 .m文件如下
// 1. MyOperatiion.h 文件
#import <Foundation/Foundation.h>

@interface MyOpreation : NSOperation

@end
//2. MyOperatiion.m 文件
#import "MyOpreation.h"

@implementation MyOpreation

- (instancetype)init
{
    self = [super init];
    if (self) {

    }
    return self;
}

// 系统会自动调用main方法
- (void)main
{
    @autoreleasepool {

        NSLog(@"我是自定义的Operation");

    }
}
@end

三. GCD (另外GCD中的回到主线程的方法和OC代码中回到主线程的方法可以互换使用)

- (void)createGCD
{

    // 创建同步队列
    dispatch_queue_t queueSerial = dispatch_queue_create("hi", DISPATCH_QUEUE_SERIAL);

    // 异步执行同步队列
    dispatch_async(queueSerial, ^{

        // 多线程code

        // 回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{

            // 相当于在主线程中执行代码

        });


    });


    // 异步执行异步队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //多线程code

        // 会到主线程
        dispatch_async(dispatch_get_main_queue(), ^{

            // 相当于在主线程中执行代码

        });


    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值