版权声明:原创作品,谢绝转载!否则将追究法律责任。
我们开发的应用基本上都是多线程的,几乎没有不是多线程的应用发布在appstore。首先我们的应用启动会默认有一个主线程,你一直在里面执行很多操作如果操作执行的时间很长,用户会马上关掉你的应用这不是你想看到的。我们可以采用多线程的技术创建一个辅助线程来把一些执行很长时间的操作放到这个辅助线程里。
下面我们看看几个术语
l 线程(线程)用于指代独立执行的代码段。
l 进程(process)用于指代一个正在运行的可执行程序,它可以包含多个线程。
l 任务(task)用于指代抽象的概念,表示需要执行工作。
我们可以这样理解:我们可以在电脑上开启多个QQ应用。每个QQ应用可以同时打开很多聊天的窗口。这里每个QQ是一个进程,然后每个QQ聊天窗口是一个QQ应用的一个线程。
现在我们可以大概了解多线程的概念了。但是我们真的要用多线程技术吗?或者说我们真的要编写多线程技术代码吗?为什么要这样问呢?
下面是我这样问的几点原因:
1:首先多线程技术是耗费资源的比如系统的内存和cpu的占用
2:多线程可能造成两个线程同时访问一块内存来造成资源争夺
3:刚才也说了多线程耗费宝贵的资源,你应该保证你多线程里面执行的操作运行时间长而且有效率。我们还得中断那些空闲的线程。这样有能降低我们应用的内存占用,来腾出内存给其他的应用。
4:线程之间的通信,有时候辅助线程可能要通知主线程做的工作怎么样了。这时候就用到了线程通信的技术。
5:线程的退出,一个线程执行完他的任务自然退出是最好的选择。但是有时候你强制退出一个线程会造成一些内存泄漏等潜在的安全问题。
6:如果你的一个线程突然因为什么原因抛出一个异常。你需要捕获异常,因为同一个进程的线程不能捕获其他线程的异常信息。我们必须把异常情况一个NSException对象从一个线程传递到另一个线程,向这个线程报告发生了什么,这样引发异常的线程可以继续执行(如果有可能),或者干脆退出。
7:线程浪费宝贵的资源我们需要提高他的效率需要专门一个run loop来处理要执行的事件,有时候还需要一个自动释放池来管理创建的一些临时对象。
这就是我们手动编写一个线程可能遇到的一些问题。因此自己写多线程代码是需要非常小心的。我们可以用其他的多线程代替的技术来做这样的工作,但是如果确实需要我们接下来也会介绍。
先说几个多线程的代替技术:
Grand Central Dispatch(
GCD):
系统管理线程,你不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的 dispatch queue。 GCD会负责创建线程和调度你的任务。系统直接提供线程管理,比应用实现更加高效。
Operation Queue:
Objective-C对象,类似于 dispatch queue。你定义想要执行的任务,并添加任务到 operation queue,后者负责调度和执行这些任务。和 GCD一样, Operation Queue也管理了线程,更加高效
asynchronous functions:
系统的一些API接口给你提供了异步的功能自动支持并发功能。这些API也许用系统的机制和进程来创建自定义的线程来执行他们的任务并且返回结果给他们。一旦你设计应用,寻找提供异步功能的API接口来代替用同步放在自定义线程。
timers:
你可以用timers在你的应用主线程来执行周期性的任务这时需要一个线程是太微不足道了。但是仍然要提供每隔一段时间的服务。
还有一些其他的技术这里就不多做介绍。
下面一篇将介绍怎么创建线程并对创建的线程进行管理的操作。