对于线程和进程的理解

来源:互联网 发布:java filereader 读取 编辑:程序博客网 时间:2024/06/02 18:11

对于线程和进程的理解

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

>

首先从进程和线程的定义来入手:
(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(), ^{            // 相当于在主线程中执行代码        });    });}
1 0