对于线程和进程的理解
前言: 由于最近刚复习了一下线程, 所以将自己的一下理解写下来, 以便自己的记忆, 并分享给大家. 纯属于个人的理解, 有不同见解的可以给我留言啊.
>
首先从进程和线程的定义来入手:
(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(), ^{
// 相当于在主线程中执行代码
});
});
}