首页 > 编程语言 > 详细

多线程

时间:2016-01-16 22:21:34      阅读:211      评论:0      收藏:0      [点我收藏+]
     每一个ios应用程序都有个专门用来更新显示的UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来不好的用户体验,一般的解决方案是:将那些耗时的操作放到另外一个线程中去执行,多线程编程就是防止主线程堵塞和增加运行效率的最佳方案。
     多线程技术在ios中具有非常重要的地位,乔布斯在2007年发布会用一段一段有趣的话“an ipod,a phone,a internet communicator,are you getting it?”。最终Apple用一个设备给出了答案而不是三个设备,那就是iPhone。毫无疑问。iOS系统有一个网络交互系统,访问网络难免有延迟,为了解决这个问题,ios设计中应用了多线程技术。
     学习多线程是一个非常漫长的过程,首先我们先来了解一下两点:
  1. 什么是多线程;
  2. 多线程中的基本概念; 
了解以上两点,对于我们任意语言环境下的多线程技术都有着很大的帮助。
 
一:什么是多线程
     Apple给出了多线程编程的定义:
     Threads are a relatively lightweight way to implement multiple paths of execution inside of an application. 翻译:线程是一个相对轻量级的,在应用程序内部,实现任务执行的多条路径的方式。
     当前使用的大多数操作系统都能同时运行多个程序(独立运行的程序又称为进程),对于同一个程序,他又可以分成独立的执行的任务流,我们称之为线程,线程和进程提供了多任务处理能力。用进程和线程的观点来研究软件是当今普遍的做法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义,现在大部分的app都是多线程多任务处理,单线程的软件是不可想象的,因此掌握多线程多任务的方法对每一个程序员都是需要掌握的。
     先来看成活中的一个例子,车站售票时如果仅仅收一个窗口售票我们可以把售票系统看成为单线程,如果旅客过多(任务)时,就会造成售票过慢的问题。这时只需增加售票窗口同时售票,来加快售票的速度,这就是多线程。
     
二:多线程中的基本概念
 
2.1 线程与进程
     进程(Process):在早期面向进程设计的计算机结构中,进程是程序的基本执行的实体;在当代面向线程的计算机结构中,线程是程序的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体,每一个正在硬件上运行的程序都是一个进程,也可能是整个程序或是部分程序的动态执行,一般的应用程序是单个进程的,也有多个进程的(谷歌浏览器);iPhone4之前是不分多任务的,即只有一个进程在执行。
     进程是静态的容器,里面容纳了很多个线程。
     线程(Thread):有时被称为轻量级进程,是程序执行流的最小单元。线程一般是一系列的方法的线性执行的路径,十一组指令(方法)的集合,或是程序的特殊段,可以再程序中独立执行。也可以将线程理解为代码运行的上下文,负责在程序中执行多任务,通常有操作系统负责多个线程的调度和执行。
     进程与线程的区别:子进程与父进程有不同的代码和数据空间,多个线程则公用一个数据空间。
 
2.2 多线程
     概念:单个程序中同时运行多个线程完成不同的任务(if_else区分执行不同的代码但并不是多线程),成为多线程。是指软件或硬件上实现多个线程并发执行的技术。
     作用:节约cpu时间,避免程序卡死。多线程并不能提高运行效率,而是可以同时执行多个任务,通过提高资源的使用效率来提高系统的效率。多线程是在同一时间完成多项任务。
     注意:多个线程并发到指定问题是,由于资源共享,多个线程可能会访问同一资源,这要求多线程共享的资源需要在被使用时进入死锁状态。
 
2.3 并行、并发与串行
     并行:一组程序按独立异步的速度执行即两行代码同时执行,注意这里不是同一时间发生,并行只是任务执行的时间有重叠罢了,要区别于并发。
     并发:在同一时间段内,两个或多个程序同时开始执行,有时间上的重叠(这里说的是宏观意义上的同时,只有多核处理器才能真正的做到微观上的真正的同时)。
     串行:与并行相对,几个任务之间依次执行。即任务执行的时间上没有重叠。
 
2.4 同步与异步
     同步:是指两个任务之间的关系,一个任务需要等待另一个任务的反馈结果才能继续执行(打电话下达通知,只有别人接电话才能完成通知的下达)。
     异步:与同步的概念相对,一个任务不需要等待其他任务的反馈也可以继续执行(发短信下达通知)。
 
注意:
     理解上面的几个概念对我们学习和使用多线程来说至关重要,而在理解上,同步异步与并行串行的概念容易搞混,下面举例理解:
     在田径赛场上,以上两个概念均体现出来。把每一个与动员看成是一行代码,运动员奔跑代表开始执行任务,跑完全程代表任务结束。
  • 线程就像一条条跑到,不同的运动员在不同的跑道上,可以达到互不干扰的目的,这也是多线程的作用。
  • 进程就像是竞技场,每一个竞技场都有自己的跑道,也就是说进程是线程的容器。早在80年代以前,是没有线程的概念的。而每次开启新的进程开销过大,就像一个竞技场只有一个跑道新建竞技场需要的资源过大。为了节约成本,就诞生了线程的概念。
  • 并行代表两个跑道之间的关系,运动员在两条跑道上是可以互补干扰的,任务的开始和结束不会受到另一个任务的干扰。
  • 串行就像是接力赛,运动员之间需要交接接力棒。也就是说一个任务完成之后下一个任务才能开始。
  • 并发是指并行的两个任务同时发生,就像运动员起跑,描述的是同一时间的关系。但是起跑肯定有快有慢,有可能做不到完全的同时,并发宏观是同时,微观有可能不是同时。
  • 同步是描述两个事件交互时的概念,比如比赛开始前,裁判通知运动员入场,只有当运动员全部入场之后比赛才能正式开始,而在运动员入场过程中,裁判处于等待状态,也就是说,同步会导致程序阻塞。
  • 异步是和同步概念相对的,在裁判通知运动员入场后,不等待运动员直接开始比赛。
 
小结:
     在整个学习多线程的过程当中,主要有两点能力是需要我们提高的,一是多线程工具的使用能力,二是多线程思维。要习惯使用多线程的方式去解决问题,但是培养多线程的编程思想需要我们用更长的时间去习惯和完善。
 
     
 
 
 
 
 
 
 
 
 
 
    

多线程

原文:http://www.cnblogs.com/factor/p/5136480.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!