一、基本概念

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的更多相关文章

  1. iOS开发之多线程技术

    本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...

  2. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  3. iOS开发-多线程开发之线程安全篇

    前言:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象.同一个变量.同一个文件和同一个方法等.因此当多个线程访问同一块资源时,很容易会发生数据错误及数据不安 ...

  4. ios开发之多线程---GCD

    一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...

  5. iOS开发之多线程(NSThread、NSOperation、GCD)

    整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...

  6. iOS开发之多线程技术(NSThread、OperationQueue、GCD)

    在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的 ...

  7. iOS开发之多线程技术——NSOperation篇

    本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation ...

  8. iOS开发之多线程技术——GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  9. iOS开发之多线程技术—GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  10. iOS开发中多线程基础

    耗时操作演练 代码演练 编写耗时方法 - (void)longOperation { for (int i = 0; i < 10000; ++i) { NSLog(@"%@ %d&q ...

随机推荐

  1. qemu cow镜像分析

    最近研究了以下qemu最简单的read on direct 镜像格式cow,在稀疏文件的模式下,这种方式还是比较简单,而且有优势的.其优势主要体现在云计算环境中,不需要用到qcow2的那些诸如内部快照 ...

  2. 163k地方门户网站系统自动审核信息脚本

    本代码实现对163k地方门户网站系统发布信息的自动审核,以及对内容中链接全过滤 软件安装 Python 安装 http://www.python.org/download/ pymssql安装 htt ...

  3. 现有C2B模式小总结

    现有的C2B模式 目前常见的C2B模式有: l  聚合需求形式(反向团购.预售等) l  要约形式(逆向拍卖,客户出价,商家选择是否接受等) l  服务认领形式(企业发布所需服务,个人认领,类似威客等 ...

  4. 使用UEditor

    在http://ueditor.baidu.com/website/上下载官方文件 文本编辑器的配置文件在ueditor.config.js 需要注意一下几点 首先 var URL = window. ...

  5. Android 文件操作之openFileOutput

    openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它.创建的文件保存在/data/data/<package ...

  6. Linux备份与恢复

    确定要备份的内容 在备份和还原系统时,Linux 基于文件的性质成了一个极大的优点.在 Windows 系统中,注册表与系统是非常相关的.配置和软件安装不仅仅是将文件放到系统上.因此,还原系统就需要有 ...

  7. ACM1174_爆头解题思路_空间三维坐标求点到直线的距离

    /* 爆头 Description gameboy是一个CS高手,他最喜欢的就是扮演警察, 手持M4爆土匪的头.也许这里有人没玩过CS,有必 要介绍一下“爆头”这个术语:所谓爆头,就是子 弹直接命中对 ...

  8. poj 3579 Median (二分搜索之查找第k大的值)

    Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...

  9. python之路-模块安装 paramiko

    paramiko介绍(全是洋文,看不懂啊,赶紧有道翻译吧,等有朝一日,我去报个华尔街): "Paramiko" is a combination of the esperanto ...

  10. Scala-Partial Functions(偏函数)

    如果你想定义一个函数,而让它只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常,这样的函数就是偏函数(顾名思异就是这个函数只处理传入来的部分参数). 偏函数是个特质其的类型为Pa ...