ios多线程

Java并发和多线程那些事儿

时光毁灭记忆、已成空白 提交于 2019-12-21 23:50:49
我记得我接触电脑的时候是在小学三年级的时候,那是1995年,那年发布了windows95,但是我学习的时候还是只是dos系统,简单对于文件的一些命令操作还有五笔 在过去的那个年代,电脑都是单CPU,也就是单任务处理;多任务处理到后来才慢慢发展起来,多任务代表电脑在同一时刻内可以处理很多并行操作,这样CPU被利用率高了,多个任务都可以共享。多任务处理的出现对于软件开发者来说需要做更多的事,就是资源释放,也就是垃圾回收,在软件不用的时候要释放资源,这样就可以给其他软件腾出资源来使用,就像ios内存机制那样,ios5之前是需要手动操作,ios5之后可以设置为自动处理,而有某些安卓程序做的不够好的,在手机后台会一直执行,从而引起手机发热,流氓软件横行,其实就是举个栗子。 然后的然后,多线程技术出现了,这样一个软件程序内部可以有多个线程可以并行操作,就像魔兽争霸里面那样,一个农民工采矿,一个农民工伐木,一个农民工出去打猎,这就是3个线程。 其实多线程要比多任务处理复杂一点,有多线程了就会涉及到并发,并发也就是说对内存的读写会出现类似脏读幻读(常见的DB我内天)的错误,虽然几率不大,但是线程一多,大并发的时候,那就有可能了。相信懂并发的朋友都知道。 其实我第一个接触的多线程语言并不是java,而是在C# winform中。相信学Java的朋友在接触swing前肯定会学习java多线程吧。

ios的线程和同步异步操作

会有一股神秘感。 提交于 2019-12-17 14:44:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ios的线程和同步异步操作 ios的线程和同步异步操作 ios的多线程,同步异步操作,都是我们日常的开发中经常会遇到的问题,本文把常见的ios线程,同步异步的操作进行了整理。 代码下载: 我博客中大部分示例代码都上传到了github,地址是:https://github.com/coolnameismy/demo, 点击跳转代码下载地址 本文代码存放目录是 ThreadAndAsynchronization 如果大家支持,请follow我的github账号,并fork我的项目,有其他问题可以在github上给我留言或者给我发邮件,coolnameismy@hotmail.com,blog的RSS订阅地址:http://liuyanwei.jumppo.com/pages/rss.xml 基础知识 1.线程和进程 ,多线程 线程和进程 :网上有一大堆很专业的说法,大多数说的都比较复杂,越复杂的解释其实说的越准确和严谨,但是常常会把人弄糊涂。这里我也不去解释了,大多数场景你可以理解为,一个应用程序就是一个进程,而一个进程可以分为多个线程 多线程 :大多数框架都支持一个进程启多个线程,比如 c#、java、obejctive-c,但是并不是所有的框架都支持,比如flex的框架就不支持多线程。

ios多线程之NSThread

拈花ヽ惹草 提交于 2019-12-15 19:38:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ios多线程之NSThread ##什么是线程: 一个进程想要执行任务,必须至少得有一个线程,但是只拥有一个主线程,线程是进程的基本执行单位,一个进程的所有任务必须在线程中执行。 ###线程的分类: **串行:**一个一个的按顺序执行。 **并行:**不按顺序执行,把一个或者多个任务分配给主线程或其他的线程进行。多线程的并发执行,其实是CPU快速的在多个线程之间的切换。CPU切换的速度足够快,就会造成多线程并发执行的假象。 ####ios中的:多线程编程技术: **1:**Pthread(基本不会使用) **2:**NSThread(每个Thread对象对应一个线程) **3:**NSOperation(面对对象的线程技术,基于GCD来实现,是对GCD的简单封装) **4:**GCD(是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术) ##NSThread: 多线程技术,只有在程序下载或者执行一些大的数据的下载,复杂大数据的增添改查中,才能体现它的特点,所以,我们需要一些大的数据。而大的数据最好获得的是高清大图的数据,首先在storyboard中创建 imageview: ###方式一 @interface ViewController () { NSThread *thread_A; } [

概述IOS多线程

妖精的绣舞 提交于 2019-12-10 08:36:06
     在了解多线程之前,我们需要先认识一下什么是 进程 和 线程 。 **进程:**是在系统中运行的一个程序,每个进程之间是独立的,每个进程均运行在其专有且受保护的内存空间内。 **线程:**一个进程想要执行任务,必须得有线程(至少一个线程),线程是进程的基本执行单元,一个进程的所有任务都必须在线程中执行。 **线程的串行:**一个线程中任务的执行是串行的,如果要在一个线程中执行多个任务,只能一个一个的按顺序执行。      那么如何多个任务同时进行?这 便引出了我们的多线程! 一、多线程 ###1.基本概念      一个进程中可以开启多个线程,每个线程可以并发/并行执行不同的任务,多线程可以提交程序的执行效率。如下图(同时执行任务ABC): ###2.多线程的原理      同一时间,CPU只能执行一个线程,只有一个线程正在执行,多线程并发执行,其实是CPU快速的在多个线程之间切换。如果CPU的切换线程的时间足够快,就会造成多线程并发执行的假象。 ###3.多线程的优缺点 **优点: **(1)能适当的提高程序的执行效率         (2)能适当的提高资源的利用率(CPU,内存) 缺点: (1)开启线程会占用一定的内存空间(主线程1M,子线程0.5M),如果开启过多的线程会占用大量的内存空间,降低程序的性能。        (2)线程越多,CPU在调度线程上的开销就越大

iOS多线程之互斥锁

爷,独闯天下 提交于 2019-12-07 00:42:27
1.安全隐患解决-互斥锁 互斥锁使用格式 @synchronized(锁对象) { // 需要锁定的代码 } 注意:锁定1份代码只用1把锁,用多把锁是无效的 互斥锁的优缺点 优点: 能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源 互斥锁的使用前提: 多条线程抢夺同一块资源 相关专业术语: 线程同步 线程同步的意思是:多条线程按顺序地执行任务 互斥锁,就是使用了线程同步技术 2.原子性和非原子性 OC在定义属性时有nonatomic和atomic两种选择 atomic: 原子属性,为setter方法加锁(默认就是atomic) nonatomic: 非原子属性,不会为setter方法加锁 atomic加锁原理 @property (assign, atomic) int age; - (void)setAge:(int)age { @synchronized(self) { _age = age; } } 3.原子性与非原子性的选择 nonatomic和atomic对比 atomic:线程安全,需要消耗大量的资源 nonatomic:非线程安全,适合内存小的移动设备 iOS开发的建议 所有属性都声明为nonatomic 尽量避免多线程抢夺同一块资源 尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力 来源: oschina 链接:

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

百般思念 提交于 2019-12-06 08:48:11
iOS多线程:『NSOperation、NSOperationQueue』详尽总结 转载: 原地址https://www.jianshu.com/p/4b1d77054b35 本文首发于我的个人博客: 『不羁阁』 文章链接: 传送门 本文更新时间:2018年03月06日17:27:55 笔者对之前写的原文重新整理,修改了部分内容,又增加了许多关于 NSOperation、NSOperationQueue 的知识及用法,希望大家喜欢。 本文用来介绍 iOS 多线程中 NSOperation、NSOperationQueue 的相关知识以及使用方法。 通过本文,您将了解到: NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperation 操作依赖和优先级、线程间的通信、线程同步和线程安全,以及 NSOperation、NSOperationQueue 常用属性和方法归纳。 文中 Demo 我已放在了 Github 上,Demo 链接: 传送门 1. NSOperation、NSOperationQueue 简介 NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装

iOS开发多线程GCD(二)

笑着哭i 提交于 2019-12-05 20:10:46
上一章我们简单介绍了iOS多线程,本章我们讲解GCD多线程 GCD (Grand Central Dispatch) 是 iOS 多任务的核心。在 Mac OS X 10.6 雪豹中首次推出,后被引入到了 iOS 4.0 中。GCD 是基于 C 的 API,是底层的框架,因此效率最高 一、分组管理 /* 分组的主要目的 是判断一组操作 是否全部执行结束 原理 将需要执行的操作 添加到同一个分组下 如果其中的某一个操作结束 就会组中移除 当组里面的操作数变为0的 说明所以的操作全部结束 */ //1.创建一个分组 管理任务 dispatch_group_t myGroup = dispatch_group_create(); //2.获取一个队列 管理的任务放在哪一个线程中来管理 //主队列就表示任务放在主线程中 自定义队列就表示任务放在分线程中(子线程) //dispatch_queue_t 表示一个队列表示获取一个队列表示获取一个队列全局队列 官方提供一个队列 该队列 默认的是并发处理 线程中的任务可以同时处理多个全局队列 官方提供一个队列 该队列 默认的是并发处理 线程中的任务可以同时处理多个 //dispatch_get_global_queue() dispatch_queue_t HIGH = dispatch_get_global_queue(DISPATCH

iOS开发多线程NSOperation(四)

好久不见. 提交于 2019-12-05 20:10:11
NSOperation 可以实现多线程 是一个抽象类 不能直接使用 实现的手段通过该类的子类 NSInvocationOperation NSBlockOperation 实现多线程 NSInvocationOperation 在创建任务时 用一个方法来表示 任务必须放在任务队列中管理 队列保持任务以先进先出的顺序 NSBlockOperation 创建任务时 用一个block来表示 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //1.NSInvocationOperation NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printA) object:nil]; //operation1代表了任务printA NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printB)

多线程的底层实现机制

扶醉桌前 提交于 2019-12-05 15:36:08
1.多线程的底层实现 (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。 多线程的作用:更新显示UI界面、处理用户触摸事件。 (3)Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。 (4)开发中实现多线程的方案 1》C语言的POSIX接口:#include<pthread.h> 2》OC的NSThread 3》 C语言的GCD接口(性能最好,代码更精简) 4》 OC的NSOperation和NSOperationQueue(基于GCD) 2.线程的通信 (1)GCD: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 下载图片 UIImage *image = nil; dispatch_async(dispatch_get_main_queue(), ^{ // 回到主线程 }); (2)NSThread的线程通信 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT

ios多线程同步异步任务、串行并行队列、死锁

匿名 (未验证) 提交于 2019-12-02 23:43:01
队列 概念:队列只负责任务的调度,而不负责任务的执行,任务是在线程中执行的。(可以理解成任务是放在队列里面的,要被调度到线程中去执行) 特点:队列先进先出,排在前面的任务最先执行。 分类:队列分为串行、并行、主队列、全局队列。 串行队列:任务按照顺序被调度,前一个任务不执行完毕,队列不会调度。 并行队列:只要有空闲的线程,队列就会调度当前任务,交给线程去执行,不需要考虑前面是都有任务在执行,只要有线程可以利用,队列就会调度任务。 主队列:只负责把任务调度到主线程去执行。所以主队列的任务都要在主线程来执行,主队列会随着程序的启动一起创建,我们只需get即可。 全局队列:是系统为了方便程序员开发提供的,其工作表现与并发队列一致。 任务的执行是在线程上去执行的。分为同步和异步。 同步:不会开启新的线程,任务按顺序执行。 异步:会开启新的线程,任务可以并发的执行。 所以就可以分成:串行队列同步执行、串行队列异步执行、并行队列同步执行、并行队列异步执行。 串行队列同步执行:按顺序执行并不会开启新的线程,则串行队列同步执行只是按部就班的 one by one 执行。 串行队列异步执行:虽然队列中存放的是异步执行的任务,但是结合串行队列的特点,前一个任务不执行完毕,队列不会调度,所以串行队列异步执行也是 one by one 的执行 并行队列同步执行:结合上面阐述的并行队列的特点