标签:
一:线程与进程的概念
0.概述:(摘抄自:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html)
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
1.进程:
计算机为某程序开辟的一段内存空间,是私有的,不允许其他进程访问。就像工厂里的车间。
2.线程:
一个线程包含以下内容。
个人理解就是进程想要执行任务,就必须依赖线程,也就是说进程里至少有一条线程,也就是主线程。类似车间想要生产,就必须有工人,而工人就是线程。
二:多线程原理:
只说一点个人理解吧。
由于刚接触这些东西,自己暂时的理解就是 CPU在处理进程中的任务时,有两种方式:
一种是串行---即按照任务的顺序来执行。比如A-B-C。需要注意的是,A B C三个任务都在同一线程中。
第二种是并行---即多个任务同时进行,此时就需要这些任务分别在不同的线程中。这样就加快了运行效率。但是需要注意的是,其实单个CPU并不是真正意义上的同时执行多个任务,而是将时间碎片化,比如按1,2,3,4....这样的顺序依次执行所有线程中的任务的一小部分,时间为δX s。循环多次直到所有线程中的任务执行完毕。当δX足够小时(我觉得这取决于cpu的运行效率?)就可以造成多任务同时进行的假象。但是对于程序的实际运行中,这样的方式却有很大作用。
三:多线程的简单应用例子:
在iOS开发的过程中,处理UI的线程是进程中的main线程。所以当主线程中有延时处理的任务时,就会影响用户体验,比如以下代码:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UISwitch *mSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; [self.view addSubview:mSwitch]; [mSwitch setSelected:YES]; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { for (int i = 0 ; i < 20000; i ++) {// 在中线程中添加一个需要延时处理的任务 NSLog(@" %d , %@", i,[NSThread currentThread]); } } @end
其中一条打印结果:
2016-01-16 15:52:49.128 耗时操作[12137:908843] 19999 , <NSThread: 0x7fc2a2506210>{number = 1, name = main}
可以看出来,延时操作确实被加入到了主线程里,在运行时也可以发现,界面上的开关变得“失灵”只有当打印结束后才会好起来。于是当主线程中有延时操作时,就需要将这个操作移到子线程中。
在viewDidload中增加代码如下:
[self performSelectorInBackground:@selector(longtimeOp) withObject:nil];
增加longtimeOp的方法:
- (void)longtimeOp
{
for (int i = 0 ; i < 20000; i ++) {// 在中线程中添加一个需要延时处理的任务
NSLog(@" %d , %@", i,[NSThread currentThread]);
}
}
上述带代码将延时操作,即touchesBegan放到子线程中。打印结果如下:
2016-01-16 16:02:37.741 耗时操作[12208:915677] 11034 , <NSThread: 0x7fbfa3e10270>{number = 2, name = (null)}
可以看到,此时当前线程的number=2,即为子线程。而且UI中的开关也可以用了。
标签:
原文地址:http://www.cnblogs.com/BJTUzhengli/p/5135672.html