码迷,mamicode.com
首页 > 移动开发 > 详细

IOS开发多线程-多线程技术1

时间:2015-08-09 12:29:02      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

一、基本概念

1.什么是进程

进程就是指在系统中正在运行的一个应用程序

每个应用之间是相互独立

每个进程都运行在其专有的并且受保护的内存空间内。 

技术分享

2.什么是线程 

一个进程想要执行程序,就必须需要一个线程,

线程是程序执行的基本单元,应用的所有的任务都在线程中执行的。 

当程序启动之后,系统会自动为进程创建一条线程,称之为 “主线程”  “UI线程”

 

 

3.线程的串行 

一个线程执行任务是串行的,也就是说,在一个线程内,执行任务是从顺序执行的 

同一时间,线程只能执行一个任务----> CPU在同一时间也只能执行一个线程

   技术分享

 二、多线程 

 1.什么是多线程 

多线程指的是,在同一个进程中,创建多个线程,每个线程"并发(同时)“执行各自的任务。

可以有效的提高系统的效率 

如下,当CPU快速的切换三条线程,就可以产生并发效果

技术分享

2.多线程的原理 

同一时间,CPU只能执行一个线程,只能又一个线程在执行;

当多线程并发的时候,CPU在多个线程之间快速的调度(切换),就能产生并发(同时)执行的现象。

 注意: 并发执行,是一种假象,看起来是同时执行的。

   并行只是,是真正的同时执行。 

3.多线程的优缺点 

优点:

能够提高程序的执行效率

能适当的提高系统资源的利用率 

缺点

开启线程是需要一定的内存空间的(默认:主线程 1M  子线程  512B),如果开启太多线程,会占用过多的内存空间;

线程越多,CPU在线程调度上的消耗增多;

线程越多,相同时间内,每个线程调度是次数就越少;

程序设计更加复杂,例如:线程之间的通信、线程之间的数据共享等问题; 

注意:系统创建的线程称为"主线程",其他的线程称为"子线程"。

三、多线程的应用 

1.主线程

主线程:当进程开启的时候,系统默认会开启 一条线程,称为:"主线程" 或"UI线程"; 

作用:

显示/刷新UI界面

处理UI界面(例如 点击、滚动、拖拽等) 

2.主线程的注意事项

为了更加良好的用户体验,不要讲耗时较长的任务放在主线程中,否则会影响UI的流畅度,造成卡顿的现象 

例如:

如果耗时较长(10s),那么主线程是会一直停留在该任务中,直到任务完成,当第5s点击时候,无法立即响应用户的点击事件 

   技术分享

将耗时较长的任务放在子线程之后,能够立即相应用户的点击事件

技术分享 

 

四、IOS多线程的实现方案

 技术分享 

五、pthread 和NSThread的简单介绍

 

1.pthread的简单介绍

创建的函数:

 int pthread_create(pthread_t * __restrict, const pthread_attr_t * __restrict,void *(*)(void *), void * __restrict); 

pthread_t *restrict:线程标识符的地址

const pthread_attr_t *restrict:设置线程的属性

void *(*)(void *):线程中执行的函数.

void *restrict:传递给执行函数的参数. 可以传一个任意类型的参数

C语言中de void * 等同于 OC中的 id    

返回值: 返回 0 代表线程创建成功

返回其他数值,代表线程创建失败,.返回的数值,是失败的状态 

注意:

     在ARC的环境下面,C语言和OC不能直接传递

     __bridge 桥接:C语言没有自动内存管理,需要对C语言代码进行添加自动内存操作,只有在ARC环境下才需要

     OC:在 ARC环境下,不需要手动添加自动内存管理(retain/release/autorelease/)

     添加的目的,就是告诉编译器,为OC代码添加自动内存管理代码

 

对该文件编译环境设置:

非ARC机制 -fno-objc-arc

ARC : -fobjc-arc

 

代码:

#import "ViewController.h"
#import <pthread.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    // 创建一个线程标识符
    pthread_t myThread;
    NSString* str = @"pthread";
    
    int result = pthread_create(&myThread, NULL, longTimeOperation, str);
    NSLog(@"%d",result);

}

void*(longTimeOperation)(void* data)
{
    NSLog(@"----%@------%@", data, [NSThread currentThread]);

    return NULL;
}

@end

 

2.NSThread的介绍 

1> 线程的创建和启动 

一个NSThread就代表这一个对象 

创建启动

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];

[thread start]; 

线程一启动,就是告诉CPU已经"就绪",当CPU调度该线程的时候,就会执行相应的方法。

 

创建线程后自动启动线程

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];

 

隐式创建并启动线程

[self performSelectorInBackground:@selector(run) withObject:nil];

 

提示: 后两种创建的方式,无法获得该线程对象,就不能对其进行更加详细的设置

 

2>常用的方法 

主线程相关的:

+ (NSThread *)mainThread; // 获得主线程

- (BOOL)isMainThread; // 是否为主线程

+ (BOOL)isMainThread; // 是否为主线程

 

获得当前线程:

NSThread *current = [NSThread currentThread];

 

线程的调度优先级

+ (double)threadPriority;

+ (BOOL)setThreadPriority:(double)p;

- (double)threadPriority;

- (BOOL)setThreadPriority:(double)p;

调度优先级的取值范围是0.0 ~ 1.0,默认0.5,值越大,优先级越高 

 

线程的名字

- (void)setName:(NSString *)n;

- (NSString *)name; 

 

六、线程的状态

 

1、线程的状态

线程一共有四种状态:就绪、运行、阻塞、死亡。

技术分享  

注意:当线程进入阻塞状态后,会从可调度线程池里面移除

 

2、线程状态的相关方法 

启动线程(进入就绪状态)

- (void)start;

 

阻塞(暂停)线程(进入阻塞状态)

+ (void)sleepUntilDate:(NSDate *)date;

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

 

强制停止线程(进入死亡状态)

+ (void)exit;

 

七、线程锁 

1、引入:线程安全问题(多个线程访问同一块数据)

 

 。。。。。未完待续

IOS开发多线程-多线程技术1

标签:

原文地址:http://www.cnblogs.com/gaox97329498/p/4714826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!