oc基础总结二 线程和进程

前言
        几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程,也就是说,所有运行中的任务通常对应一个进程。
        当一个程序运行时,内部可能包含多个顺序执行流,每个顺序执行流就是一个线程。

一、进程:

1、简介
(1)进程是指在系统中正在运行的一个应用程序。
(2)每个进程之间是独立的,每个进程均运行在其专用且受保护的内容空间内。
(3)通过“活动监视器”可以查看mac系统中所开启的进程。
2、进程通信
单机系统中进程通信有四种形式:主从式、会话式、消息或邮箱机制、共享存储区方式。
主从式例子:终端控制进程和终端进程。
会话式例子:用户进程与磁盘管理进程之间的通信。

二、线程

1、线程简介:
1》线程(Thread),也称作轻量级进程,线程是进程的组成部分,一个进程可以拥有多个线程。
2》线程在程序中是独立的、并发的执行流,当进程被初始化后,主线程就被创建了。
3》可以在进程内创建多条顺序执行流,这些顺序执行流就是线程,每条线程是相互独立的。
4》线程是独立运行的,单个线程他是不知道进程中是否存在其他的线程,线程的执行是抢占式的。(当前运行的线程在任何时候都可能被挂起,以便另外一个线程可以运行)。
2、注意点:
(1)一个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程,可以有多个线程)。
(2)线程是进程的基本执行的单元,一个进程(程序)的所有的任务都在线程中执行。
(3)一个线程中的任务的执行是串行的。(如果要在一个线程中执行多个任务,那么只能一个一个地按照顺序执行这些任务)。
(4)在同一时间内,一个线程只能执行一个任务。
3、线程总结:
(1)操作系统可以同时执行多个任务,每个任务就是进程,进程可以同时执行多个任务,每个任务就是线程。
(2)一个程序运行后至少有一个进程,一个进程例可以包含多个线程,但至少有一个主线程。
4、 线程执行特性:
(1)线程只有3个基本状态:就绪,执行,阻塞。
(2)线程存在5种基本操作来切换线程的状态:派生、阻塞、激活、调度、结束。

三、多线程

1、
(1)一个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。
(2)多线程技术可以提高程序的执行效率。

2、多线程的原理:
(1)同一时间,CPU只能处理一条线程,只有一条线程在工作(执行)。
(2)多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)。
(3)如果CPU调度线程的时间足够快,就会造成了多个线程并发执行的假象。
(4)如果线程非常多,CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源,每条线程被调用执行的频次会降低(线程的执行效率降低)。

3、 多线程的优点:
(1)能够适当提高程序的执行效率。
(2)那那个适当地提高资源利用率(CPU、内存利用率)。

4、多线程的优势:
(1)对于单线程的应用而言,整个应用只有一个顺序执行流,当执行流在某个耗时操作或不能立即完成的任务时(如网络请求、复杂的操作和运行过程、某些必须消耗一定时间后才能完成的操作),该执行流就会被阻塞,整个应用就会被卡在那里无法继续执行,因此单线程的程序往往功能非常有限。
(2)在实际应用中多线程是非常有用的,例如:用户操作界面上的某个按钮时,该按钮需要执行的任务需要几秒甚至十几秒,如果直接在UI线程(主线程)中完成这个任务,在该任务执行完成、返回之间,UI线程被该任务阻塞,无法响应用户的其他操作(这段时间内,用户对iOS系统的操作将不会有任何反应,除非用户单机Home键返回,但这并不是用户希望的结果)。

5、多线程的缺点
(1)开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
(2)线程越多,CPU在调度线程上的开销就越大。
(3)程序设计更加复杂:如线程之间的通信,多线程的数据共享。

6、多线程在iOS开发中的应用
(1)主线程:一个iOS程序运行后,默认会开启1条线程,称为主线程(UI线程)。

(2)主线程的主要作用:
1、显示、刷新UI界面
2、处理UI事件(点击事件、滚动事件、拖曳事件等)。

(3)主线程:注:比较耗时的操作不要放在主线程中。耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种卡的坏的体验。


7、创建线程
(1)一个NSThread对象就代表一条线程
(2)创建、启动线程
1>方式一:
-(id)initWithTarget:(id)target selector:(SEL)selector object:(id)arg;创建一个新的线程对象。
示例:
 NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
线程一启动,就会在线程thread中执行self的run方法。

注:target:对象self的selector方法体代表了线程需要完成的任务,因此相当于把target对象的selector方法转换为线程执行体。

2>方式二:创建线程后自动启动线程
+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)arg;
示例:
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
优点:简单快捷
缺点:无法对线程进行更详细的设置

方式一、二的区别:这两种创建线程的方式并没有明显区别,只是第一种方式是一个实例方法,该方法返回一个NSThread对象,必须调用start方法启动线程;而第二种方法不会返回NSThread对象,因此这种方式会直接创建并启动线程。

3>方式三:隐式创建并启动线程
[self performSelectorInBackground:@selector(run) whithObject:nil];
优点:简单快捷
缺点:无法对线程进行更详细的设置

(3)主线程的相关用法:
+(NSThred *)mainThread;//获得主线程
- (BOOL)isMainThread;//是否为主线程
+(BOOL)isMainThread;//是否为主线程

(4)获得当前线程
NSThread *current = [NSThread currentThread];

(5)线程的调度优先级:调度优先级的取值范围是0.0~1.0,默认0.5,值越大,优先级越高。
+(double)threadPriority;
+(BOOl)setThreadPriority:(double)p;

(6)设置线程的名字
-(void)setName:(NSString *)n;
-(NSString *)name;

8、iOS中的多线程编程技术
(1)使用NSThread实现多线程
(2)使用NSOperation与NSOperationQueue实现多线程
(3)使用GCD(Grand Central Dispatch)实现多线程
注:这三种方式,从上到下抽象程度从低到高的,抽象程度越高的用法月简单。
代码:


四、多线程的安全隐患

1、资源共享
一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源。当多个线程访问同一资源时,很容易引发数据散乱和数据安全问题。(如多个线程访问同一个对象、同一个变量、同一个文件)。

2、解决方法:使用互斥锁
使用的格式:@synchronized(锁对象){//需要锁定的代码}
注:锁定一份代码只用一把锁,用多吧锁是无效的。

3、互斥锁的优点:能有效防止因多线程抢夺资源造成的数据安全问题

4、互斥锁的缺点:需要消耗大量的CPU资源。

5、互斥锁的使用前提:多条线程抢夺同一块资源。
相关专业术语:线程同步,多条线程按顺序地执行任务。(互斥锁就是使用了线程同步技术)。

6、示例:在创建单例模式时,最好使用互斥锁。此处示例是创建UserInfo类的单例对象。
代码部分:

static UserInfo *singletonUserInfo = nil;

+(UserInfo *)shareUserInfo{

    @synchronized(self){

      //创建一个线程锁,防止多线程中多次创建

        if (singletonUserInfo == nil) {

            singletonUserInfo = [[UserInfo alloc]init];

            NSLog(@"初始化");

        }

    }

    return singletonUserInfo;

}




五、原子性、非原子性
atomic:原子性,为setter方法加锁(默认就是atomic),线程安全,需要消耗大量的资源
nonatomic:非原子性,不会为setter方法加锁,非线程安全,适合内存小的移动设备
iOS开发:最好所有属性都声明为nonatomic,尽量避免多线程抢夺同一块资源,尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值