多线程的简单理解

1.进程和线程

1.进程:一个正在运行的程序,称为一个进程。且每个进程,都有自己独立的内存空间运行,进程之间互不影响。
2.1线程:进程的所有任务都是由线程去执行的,线程是进程的基本执行单元。
2.2进程的串行:
①单个进程中执行的任务,是串行,每个任务是按顺序执行的。
3.进程和线程的比较:
3.1进程
①进程是CPU分配资源和调度的单位
②同一个进程中的线程,共享该进程中的资源
3.2
①线程是CPU调用(执行任务)的最小执行单元
②一个线程可以有多个线程

2.多线程

1.概念:一个进程有多个线程,每个线程并行执行不同的任务(eg:下载一个应用程序,可以使用不同的线程,同时下载不同的文件)
2.原理:
①同一时间,CPU只能调用一条线程,也就是说同一时间只有一条线程在执行任务
②并行,就是CPU(特指单核)以最快的速度,在线程之间进行切换,调度,造成并行的假象
③多核CPU,每个核心都可以同时处理不同的任务,从而真正达到了多线程并发执行任务
3.多线程的优缺点:
3.1优点
①提高程序运行效率
②提高了资源利用率,充分使用了空间的内存和CPU资源
3.2缺点
①没创建一条线程,都会开辟新的内存空间,并且消耗大约90毫秒的时间
②多线程设计上往往有些困难,线程间的切换、主线程子线程之间的协调,都是开发中很难解决的。

3.多线程在iOS开发中的应用

1.主线程
①应用程序启动之后,在UIApplication中会自动开启一条主线程(UI线程)
②主线程的作用,主要是用来显示/刷新UI界面,处理UI事件
2.使用时的注意事项
①耗时的操作(加载事件过长的操作),不要放在主线程里,否则会影响主线程处理UI事件,导致运行界面拖慢,降低用户体验
②当耗时操作还没有结束时,UI界面无法影响用户的交互,直到耗时操作结束后,主线程才能继续处理UI事件
③因此:耗时操作,应该放在子线程中去执行(例如后台线程)

1.NSThread

优点:轻量级的多线程
缺点:需要自己管理线程的生命周期,线程同步

开辟子线程的方法

1.使用NSObject开辟子线程(在后台执行某个方法)

/**    
 performSelectorInBackground:需要使用子线程执行的方法   
 withObject:传递的参数    
 */    
[self performSelectorInBackground:@selector(SayHi)withObject:@"dadadada"];

2.使用NSThread手动开辟子线程
1).创建子线程
2).开启线程
3).关闭线程

//    //1.创建线程(NSThread)
   NSThread*thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(SayHi)object:nil];//    
//2.开启线程   
 [thread start];//   
 //3.关闭线程(可写可不写)  
  [NSThreadexit];//  
  //4.取消线程(实际上就是做了标记,表示被取消了) 
   [thread cancel];

3.使用NSThread自动开辟子线程(无需手动)

  //延迟方法    
[NSThread sleepForTimeInterval:5];  
  [NSThread detachNewThreadSelector:@selector(SayHi) toTarget:self withObject:nil];
}
- (void)SayHi{  
  //为保证对象的及时释放,在多线程方法中需要添加自动释放池   
 @autoreleasepool {       
 NSLog(@"嗨,孙子");     
   NSLog(@"mainThread = %@",[NSThread mainThread]);        
NSLog(@"currentThread = %@",[NSThread currentThread]);
    }    
//在子线程下,使用NSObject回到主线程 
   /**    
 performSelectorOnMainThread:回到主线程之后需要做的事情(方法)    
 withObject:传递的参数   
  waitUntilDone:判断 方法 是否执行完毕 
    YES:先执行方法,再回调该函数,执行该函数后面的语句     
*/ 
   NSLog(@"before"); 
   [self performSelectorOnMainThread:@selector(onMainThread) withObject:nil waitUntilDone:YES];    NSLog(@"after");
}
- (void)onMainThread{   
 NSLog(@"callBack");   
 NSLog(@"%@",[NSThread currentThread]);  
  NSLog(@"%d",[NSThread isMainThread]);
}
线程之间的通信

1.线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行同行
2.体现:
①一个线程传递数据给另一个线程
②在1个线程中执行完特定任务后,转到另一个线程继续执行任务
线程间通信常用的方法

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
线程间通信的例子:NSThread图片的异步下载
20160120092431818.png
#import "ViewController.h"
@interface ViewController ()
/* 声明一个ImageView用于显示图片 */
@property (strong,nonatomic) UIImageView *imageView;
/* 声明一个NSData对象,用于接收图片的数据 */
@property (strong,nonatomic) NSData *imageData;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *showImageView =[[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];    showImageView.backgroundColor = [UIColor redColor];    self.imageView = showImageView;
    [self.view addSubview:showImageView];  
}
#pragma mark --- 添加一个相应方法,触发创建子线程,执行加载数据 ---- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    //创建子线程,执行加载图片方法    [self performSelectorInBackground:@selector(loadImage) withObject:nil];
}
- (void)loadImage{ 
   //1.创建URL
    NSString *urlstring = @"http://pic1.win4000.com/wallpaper/1/5497cc9f938b2.jpg";  
  NSURL *url = [NSURL URLWithString:urlstring];   
 //2.创建请求 
   NSURLRequest *request = [NSURLRequest requestWithURL:url];   
 //3.接收数据,使用imageData    
self.imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];  
  //回到主线程刷新数据  
  [self performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}

- (void)reloadData{ 
   //刷新UI   
 if ([NSThread isMainThread]) {  
      self.imageView.image = [UIImage imageWithData:self.imageData];   
 }
}
@end

2. NSOperation、NSOperationQueue

  1. NSOperation
    1.1首先,它是一个抽象类,所以执行任务的是它的子类:NSInvocationOperation和NSBlockOperation。
    这两个子类,就相当于一个方法选择器"prefromSelector()"由他俩本身发起的任务,并不是在子线程中执行。
    1.2 NSOperation和它的子类,本身不会进行线程的创建,所以,在他们的任务方法中打印当前线程,显示为主线程
    1.3 NSOperation和它的子类,只是一个操作,本身没有主线程,子线程之分,可以在任何方法中使用,通常和NSOperationQueue综合使用
  1. NSOperationQueue
    2.1一个NSOperationQueue操作队列,就相当于线程管理器,将NSOperation和子类的对象放入到队列中,然后由队列负责派发任务,所以NSOperationQueue并不是一个线程。但是,你可以设置对列中运行的线程的数量。
  2. NSOperationQueue的优点
    不需要手动关联线程,只需要把精力放在自己要执行的操作上面。
  3. NSOperationQueue的缺点
    它是基于�OC对象的,那么相对于C函数来说效率要低,而且基于GCD,那么GCD提供的功能比他更全面。
    今天先写到这里 明日继续 如有错误之处 还请打神门指点一二
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 线程:简单的说就是处理事务的任务链,当只有一条链,所有的事情都在这一条链上执行时,那就是单线程,单线程有很多缺点,...
    一字码阅读 9,080评论 0 3
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 596评论 0 0
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    伯恩的遗产阅读 274,236评论 251 2,331
  • 对,你没有看错,期许要开始给大家分享PPT动画系列的教程了! 从公众号开始更新,一直都没有给大家介绍过PPT动画的...
    掌上ppt阅读 5,460评论 18 134
  • NSHipster 之 NSURLProtocol link 要点 Foundation库的URL加载系统是每个i...
    yhtang阅读 321评论 0 0