代码改变世界

IOS 多线程之 NSThread

2016-01-17 17:16  000aaa  阅读(351)  评论(0编辑  收藏  举报

线程概述

有些程序是一条直线,起点到终点——如简单的hello world,运行打印完,它的生命周期便结束了,像是昙花一现。

有些程序是一个圆,不断循环直到将它切断——如操作系统,一直运行直到你关机。

一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流。

Mac和IOS中的程序启动,创建好一个进程的同时,一个线程便开始运作,这个线程叫做主线程。主线成在程序中的位置和其他线程不同,它是其他线程最终的父线程,且所有的界面的显示操作即AppKit或UIKit的操作必须在主线程进行。

系统中每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则公用进程的内存空间。

 

 

1.什么是进程?

进程:最直观的就是一个个pid,进程是程序在计算机上的一次执行活动。从main函数开始到main函数的return结束!

(由此可见:大部分的app都只有一个main函数,也就是单进程应用!!!)

2.什么是线程?

一个进程中至少有一个线程(主线程),创建一个新的线程就是给进程增加一个执行流,(就像一条河流,在主干道向多出一个分流这样主干道的任务量就减少了!!)

3.为什么要用多线程有什么好处?

在一些任务量比较大的情况下,主线程中处理需要花费比较多得时间(这样UI界面会很不流畅)可以开启子线程 让这些任务有子线程在后台来处理,处理完了回到主线程中更新UI 就可以了

iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞

(举个例子:一个坐汽车的工厂,他需要的各种配件,自己坐起来耗费时间周期比较长,这样就直接让其他的配件公司去做,它只用等做好了用就可以了)

 

4.多线程应用场景。

异步请求,下载图片,如果执行一项任务需要多个步骤,每一步都需要等待上一步的结果,这样就处理起来很耗时可以同时开启多个线程 让每一步在一个线程中执行  这样可以减少等待的时间等等!!!

 

 

下面介绍NSThread iOS开发中的应用

1.创建一个线程

//实例方法创建一个线程  ---- 需要手动的开始执行线程
    NSThread * thread1 = [[NSThread alloc]initWithTarget:self selector:@selector(firstThread:) object:nil];
    // 设置线程的优先级(0.0 ~ 1.0,1.0是最高级)
    thread1.threadPriority = 0.7;
    // 开启线程
    [thread1 start];

-(void)firstThread:(NSThread *)sender
{
    NSLog(@"firstThread");
}
// 调用完毕后,会马上创建并开启新线程----静态创建
    [NSThread detachNewThreadSelector:@selector(secondThread:) toTarget:self withObject:nil];



-(void)secondThread:(NSThread *)sender
{
    NSLog(@"secondThread");
}
//隐式创建一个线程
    [self performSelectorInBackground:@selector(thirdThread:) withObject:nil];

-(void)thirdThread:(NSThread *)sender
{
    NSLog(@"thirdThread");
}

 

2.获取主线程和当前正在执行任务的线程

//获取主线程
    NSThread *mainThread = [NSThread mainThread];
//获取当前正在执行任务的线程
    NSThread *currentThread = [NSThread currentThread];

3.让线程停止几秒钟后在执行

//获取当前正在执行任务的线程
    NSThread *currentThread = [NSThread currentThread];
    //让当前执行任务的线程  停止2s后在继续执行   注意非必要的情况下不允许让主线程停止,不然界面会被卡住
    [NSThread sleepForTimeInterval:2];
    /*
    NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]];
    [NSThread sleepUntilDate:date];
    */

4.线程间的跳转执行

 //回主线程
[self performSelectorOnMainThread:@selector(runOnMainThread) withObject:nil waitUntilDone:YES];


//回到当前线程中去执行相应的任务
 [self performSelector:@selector(run) withObject:nil];
    

//回到指定的线程中去执行相应的任务
[self performSelector:@selector(run) onThread:oneThread withObject:nil waitUntilDone:YES];

5.NSThread 和NSOperationQueue  GCD 相比之下的优缺点

优点:NSThread 比其他两个轻量级

缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

 

 

文章到此就结束啦,希望对路过的朋友有所帮助!!!