OC多线程的理解
来源:互联网 发布:桔子数据库 编辑:程序博客网 时间:2024/05/02 06:15
线程(线程)用于指代独立执行的代码段。
进程(process)用于指代一个正在运行的可执行程序,它可以包含多个线程。
任务(task)用于指代抽象的概念,表示需要执行工作。
我们可以这样理解:我们可以在电脑上开启多个QQ应用。每个QQ应用可以同时打开很多聊天的窗口。这里每个QQ是一个进程,然后每个QQ聊天窗口是一个QQ应用的一个线程。
这三种编程方式从上到下,抽象度层次是从低到高,抽象程度越高的使用越简单,也是Apple最推荐使用的。
三种方式的优缺点:
NSThread
优点:NSThread比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
Cocoa operation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。Cocoa operation相关的类是NSOperation, NSOperationQueue。 NSOperation是个抽象类,使用它必须使用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation和 NSBlockOperation。创建NSoperation子类的对象,把对象添加到NSoperationQueue队列里执行。
GCD
这是Apple开发的一个多核编程的解决办法。GCD是一个替代诸如NSThread, NSOperationQueue, NSinvocationOperation等技术的很高效和强大的技术。
1:首先多线程技术是耗费资源的比如系统的内存和cpu的占用
2:多线程可能造成两个线程同时访问一块内存来造成资源争夺
3:刚才也说了多线程耗费宝贵的资源,你应该保证你多线程里面执行的操作运行时间长而且有效率。我们还得中断那些空闲的线程。这样有能降低我们应用的内存占用,来腾出内存给其他的应用。
4:线程之间的通信,有时候辅助线程可能要通知主线程做的工作怎么样了。这时候就用到了线程通信的技术。
5:线程的退出,一个线程执行完他的任务自然退出是最好的选择。但是有时候你强制退出一个线程会造成一些内存泄漏等潜在的安全问题。
6:如果你的一个线程突然因为什么原因抛出一个异常。你需要捕获异常,因为同一个进程的线程不能捕获其他线程的异常信息。我们必须把异常情况一个 NSException对象从一个线程传递到另一个线程,向这个线程报告发生了什么,这样引发异常的线程可以继续执行(如果有可能),或者干脆退出。
7:线程浪费宝贵的资源我们需要提高他的效率需要专门一个run loop来处理要执行的事件,有时候还需要一个自动释放池来管理创建的一些临时对象。
Grand Central Dispatch(GCD):
系统管理线程,你不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的 dispatch queue。 GCD会负责创建线程和调度你的任务。系统直接提供线程管理,比应用实现更加高效。
GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制。它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行(但不保证一定先执行结束)。
通过与线程池的配合,dispatch queue分为下面两种:
• Serial Dispatch Queue --线程池只提供一个线程用来执行任务,所以后一个任务必须等到前一个任务执行结束才能开始。
• Concurrent Dispatch Queue -- 线程池提供多个线程来执行任务,所以可以按序启动多个任务并发执行。
1. Basic Management
我们可以通过dispatch_queue_cretae来创建队列,然后用dispatch_release释放。比如下面两段代码分别创建串行队列和并行队列:
dispatch_queue_t serialQ = dispatch_queue_create("eg.gcd.SerialQueue", DISPATCH_QUEUE_SERIAL);
1.dispatch_async(serialQ, ^{
2. // Code here
3.});
4.dispatch_release(serialQ);
dispatch_queue_t concurrentQ = dispatch_queue_create("eg.gcd.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
1.dispatch_async(concurrentQ, ^{
2. // Code here
3.});
4.dispatch_release(concurrentQ);
而系统默认就有一个串行队列main_queue和并行队列global_queue:
1.dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2.dispatch_queue_t mainQ = dispatch_get_main_queue();
2. Normal Control
•dispatch_once
它可以保证整个应用程序生命周期中某段代码只被执行一次!
•dispatch_after
有时候我们需要等个几秒钟然后做个动画或者给个提示,这时候可以用dispatch_after这个函数
•dispatch_set_target_queue
通过dispatch_set_target_queue函数可以设置一个dispatch queue的优先级,或者指定一个dispatch source相应的事件处理提交到哪个queue上。
dispatch_set_target_queue(serialQ, globalQ);
•dispatch_apply
执行某个代码片段若干次。
dispatch_apply(10, globalQ, ^(size_t index) {}
•dispatch group
Dispatch Group机制允许我们监听一组任务是否完成。
•dispatch_barrier_async
通过dispatch_barrier_async函数提交的任务会等它前面的任务执行结束才开始,然后它后面的任务必须等它执行完毕才能开始。
Operation Queue:
Objective-C对象,类似于 dispatch queue。你定义想要执行的任务,并添加任务到 operation queue,后者负责调度和执行这些任务。和 GCD一样, Operation Queue也管理了线程,更加高效
asynchronous functions:
系统的一些API接口给你提供了异步的功能自动支持并发功能。这些API也许用系统的机制和进程来创建自定义的线程来执行他们的任务并且返回结果给他们。一旦你设计应用,寻找提供异步功能的API接口来代替用同步放在自定义线程。
timers:
你可以用timers在你的应用主线程来执行周期性的任务这时需要一个线程是太微不足道了。但是仍然要提供每隔一段时间的服务。
线程与进程的区别和联系?
线程是进程的基本单位 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
简述多线程的作用以及什么地方会用到多线程?OC实现多线程的方法有哪些?
谈谈多线程安全问题的几种解决方案?何为线程同步,如何实现的?分线程回调主线程方法是什么,有什么作用?
(1)、多线程的作用:可以解决负载均衡问题,充分利用cpu资源。为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而互不干扰,
(2)、大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文件、视频图像的采集、处理、显示、保存等。 (3)、ios有三种主要方法:1、NSThread。2、NSOperation。3、GCD。 (4)解决方案:使用锁:锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正确性。使用POSIX互斥锁;使用NSLock类;使用@synchronized指令等。
(5)回到主线程的方法: dispatch_async(dispatch_get_main_queue(), ^{ });
作用:主线程是显示UI界面,子线程多数是进行数据处理
- OC多线程的理解
- 基于OC的多线程
- 理解OC的Runtime
- OC block变量的理解
- OC中@class的理解
- OC一些概念上的理解
- oc中block的理解
- OC:希尔排序的理解
- OC多线程
- OC多线程
- OC多线程
- OC多线程
- 对OC的理解 以及 OC的特性
- java多线程的理解
- 多线程同步的理解
- 多线程的理解
- 多线程的理解
- 多线程的理解
- Android Http POST请求
- BottomSheet的用法
- PHPStorm IntelliJ IDEA 代码缩进风格设置
- Java 笔记(01)之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
- 深入剖析 JavaScript 的深复制
- OC多线程的理解
- linux 下无法shutdown.sh Tomcat的解决办法
- hdu5738组合计数,极角排序
- Quartz定时任务简单实现
- c++中的string常用函数用法总结!
- AFNetworiking与ASIHttpRequest对比
- 71.You configured the Flash Recovery Area for your database. The database instance has been started
- angularjs 自定义指令
- 小问题汇总——JS篇 -持续更新