多线程相关知识
2016-11-01 19:46
232 查看
仅仅是自己在开发过程中总结的,仅供参考,写的不详细,就是直接写了多线程的用法
什么是线程:一个进程想要执行任务必须要有线程,每一个进程至少有一个线程。一个进程的所有的任务都在线程中进行;
什么是进程:是指系统正在运行的一个应用程序。每个进程之间是独立的,每个进程在其专用且受保护的内存空间内。
什么是多线程:一个进程中可以开启多条线程,就是在同一时刻,可以做不同的任务。每条线程可以同时执行不同的任务,多线程技术可以提高程序的执行效率。多线程的原理就是:cpu快速的在多线程之间调度。
Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。线程之间的通信等比较麻烦。开发中很少使用Mach级别的线程,因为Mach级别的线程没有提供多线程的基本特征,线程之间通信不容易实现,线程之间是独立的。
那么开发中呢实现多线程的方案有:
1、 C语言的POSIX接口:pthread(是一套多线程API(Application, Programming,Interface应用程序编程接口),适用于Unix,Linux,windows等系统,可跨平台,可移植,但是使用难度较大。)
利用pthread怎样开辟线程的:
//创建线程
pthread_t thread;
//为线程对象赋值,并执行线程上的操作
pthread_create(&thread,
nil, 执行的方法,
NULL);
2、OC中的NSThread:(使用更加面向对象。简单易用,可直接操作线程对象。)
开辟线程的几种方式,线程之间的通信,怎样回到主线程和子线程执行任务的
//创建一个线程对象,最后一个参数是指run方法的参数,线程是在方法完全执行结束后销毁的。
NSThread
*thread = [[NSThread
alloc]
initWithTarget:self
selector:@selector(run:)
object:@"firstThread"];
thread.name
=
@"huashanthread";
//开启线程,这时会让线程自动启动里面的方法
[thread
start];
//其他开辟线程的方法
[NSThread
detachNewThreadSelector:@selector(run:)
toTarget:self
withObject:@"secondThread"];
//隐式创建并开启线程
[self
performSelectorInBackground:@selector(run:)
withObject:@"thridThread"];
//让线程睡两秒
[NSThread
sleepForTimeInterval:2];
[NSThread
sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
//让线程睡到永远的将来,一个不确定的将来,用了它之后下面的代码会在很久之后执行
[NSThread
sleepUntilDate:[NSDate
distantFuture]];
//线程退出
[NSThread
exit];
//加锁之后就防止出现线程抢夺资源的问题,必需保证加的是同一把锁,也可以用self当作当前的锁对象
@synchronized(不一定是self,但必须是唯一的)
{
if (_ticketCount
>
0)
{
NSLog(@"%@卖了+++++第%ld张票", nameStr,
_ticketCount);
_ticketCount--;
}
else
{
NSLog(@"票已经卖完");
break;
}
}
//切换到主线程去刷新UI,最后一个参数表示是否等待当前selector中的方法执行完后再执行后面的操作。
[self
performSelectorOnMainThread:@selector(showImage:)
withObject:image
waitUntilDone:NO];
[self
performSelector:@selector(showImage:)
onThread:[NSThread
mainThread]
withObject:image
waitUntilDone:YES];
获取下载东西的耗时
CFTimeInterval beginTime =CFAbsoluteTimeGetCurrent();
CFTimeInterval endTime = CFAbsoluteTimeGetCurrent();
线程间通信的体现:一个线程传递数据给另一个线程。一个线程中执行完特定任务后,转到另一个线程继续执行任务。
线程间通信的常用方法:
-(void)performSelectorOnMainThread:(SEL)aSelector WithObject:(id)arg waitUntilDone:(BOOL)wait;在主线程上执行那个方法,传参,是否执行完
-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
3、C语言中的GCD(性能最好,代更加精简):(旨在替代NSThread等线程技术,充分利用设备的多核性能。线程的生命周期自动管理。)
很容易就能实现线程之间的通信。异步同步,并发和串行
GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理代码在系统集中实现,开发者只需要定义想要执行的任务并且追加到适当的dispatchQueue中,GCD就可以生成必要的线程并计划执行任务。
优点:GCD可以将花费时间极长的任务放到后台执行,可以改善应用的响应性能。GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱。GCD
具有在常见模式(例如单例)上用更高性能的原语优化你的代码的潜在能力
dispatch_async(queue, ^{;比较耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{耗时任务完成后,拿到资源,更新UI,更新UI只能在主线程中更新。创建了一个并行队列queue,并异步执行耗时操作,当耗时操作执行完毕,我拿到其中的资源回到主线程来更新相应的UI,在这个Block代码块之外,主线程并不会被耗时任务所堵塞,可以流畅的处理其他事情。
串行:意味着在同一时间,有且只有一个任务被执行,即一个任务执行完毕之后再执行下一个任务。
并发:意味着在同一时间,有多个任务被执行。
同步:意味着在当前线程中执行任务,不具备开启新的线程的能力。
异步:在新的线程中执行任务,具备开启新的线程的能力。
4、OC的NSOperation:(基于GCD,相当于OC基于C语言的封装,比GCD多了一些简单易用的功能,使用更加面向对象,自动管理线程的生命周期)
什么是线程:一个进程想要执行任务必须要有线程,每一个进程至少有一个线程。一个进程的所有的任务都在线程中进行;
什么是进程:是指系统正在运行的一个应用程序。每个进程之间是独立的,每个进程在其专用且受保护的内存空间内。
什么是多线程:一个进程中可以开启多条线程,就是在同一时刻,可以做不同的任务。每条线程可以同时执行不同的任务,多线程技术可以提高程序的执行效率。多线程的原理就是:cpu快速的在多线程之间调度。
Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。线程之间的通信等比较麻烦。开发中很少使用Mach级别的线程,因为Mach级别的线程没有提供多线程的基本特征,线程之间通信不容易实现,线程之间是独立的。
那么开发中呢实现多线程的方案有:
1、 C语言的POSIX接口:pthread(是一套多线程API(Application, Programming,Interface应用程序编程接口),适用于Unix,Linux,windows等系统,可跨平台,可移植,但是使用难度较大。)
利用pthread怎样开辟线程的:
//创建线程
pthread_t thread;
//为线程对象赋值,并执行线程上的操作
pthread_create(&thread,
nil, 执行的方法,
NULL);
2、OC中的NSThread:(使用更加面向对象。简单易用,可直接操作线程对象。)
开辟线程的几种方式,线程之间的通信,怎样回到主线程和子线程执行任务的
//创建一个线程对象,最后一个参数是指run方法的参数,线程是在方法完全执行结束后销毁的。
NSThread
*thread = [[NSThread
alloc]
initWithTarget:self
selector:@selector(run:)
object:@"firstThread"];
thread.name
=
@"huashanthread";
//开启线程,这时会让线程自动启动里面的方法
[thread
start];
//其他开辟线程的方法
[NSThread
detachNewThreadSelector:@selector(run:)
toTarget:self
withObject:@"secondThread"];
//隐式创建并开启线程
[self
performSelectorInBackground:@selector(run:)
withObject:@"thridThread"];
//让线程睡两秒
[NSThread
sleepForTimeInterval:2];
[NSThread
sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
//让线程睡到永远的将来,一个不确定的将来,用了它之后下面的代码会在很久之后执行
[NSThread
sleepUntilDate:[NSDate
distantFuture]];
//线程退出
[NSThread
exit];
//加锁之后就防止出现线程抢夺资源的问题,必需保证加的是同一把锁,也可以用self当作当前的锁对象
@synchronized(不一定是self,但必须是唯一的)
{
if (_ticketCount
>
0)
{
NSLog(@"%@卖了+++++第%ld张票", nameStr,
_ticketCount);
_ticketCount--;
}
else
{
NSLog(@"票已经卖完");
break;
}
}
//切换到主线程去刷新UI,最后一个参数表示是否等待当前selector中的方法执行完后再执行后面的操作。
[self
performSelectorOnMainThread:@selector(showImage:)
withObject:image
waitUntilDone:NO];
[self
performSelector:@selector(showImage:)
onThread:[NSThread
mainThread]
withObject:image
waitUntilDone:YES];
获取下载东西的耗时
CFTimeInterval beginTime =CFAbsoluteTimeGetCurrent();
CFTimeInterval endTime = CFAbsoluteTimeGetCurrent();
线程间通信的体现:一个线程传递数据给另一个线程。一个线程中执行完特定任务后,转到另一个线程继续执行任务。
线程间通信的常用方法:
-(void)performSelectorOnMainThread:(SEL)aSelector WithObject:(id)arg waitUntilDone:(BOOL)wait;在主线程上执行那个方法,传参,是否执行完
-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
3、C语言中的GCD(性能最好,代更加精简):(旨在替代NSThread等线程技术,充分利用设备的多核性能。线程的生命周期自动管理。)
很容易就能实现线程之间的通信。异步同步,并发和串行
GCD是异步执行任务的技术之一,一般将应用程序中记述的线程管理代码在系统集中实现,开发者只需要定义想要执行的任务并且追加到适当的dispatchQueue中,GCD就可以生成必要的线程并计划执行任务。
优点:GCD可以将花费时间极长的任务放到后台执行,可以改善应用的响应性能。GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱。GCD
具有在常见模式(例如单例)上用更高性能的原语优化你的代码的潜在能力
dispatch_queue_t queue = dispatch_queue_create(
"cn.chutong.www"
, DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{;比较耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{耗时任务完成后,拿到资源,更新UI,更新UI只能在主线程中更新。创建了一个并行队列queue,并异步执行耗时操作,当耗时操作执行完毕,我拿到其中的资源回到主线程来更新相应的UI,在这个Block代码块之外,主线程并不会被耗时任务所堵塞,可以流畅的处理其他事情。
串行:意味着在同一时间,有且只有一个任务被执行,即一个任务执行完毕之后再执行下一个任务。
并发:意味着在同一时间,有多个任务被执行。
同步:意味着在当前线程中执行任务,不具备开启新的线程的能力。
异步:在新的线程中执行任务,具备开启新的线程的能力。
4、OC的NSOperation:(基于GCD,相当于OC基于C语言的封装,比GCD多了一些简单易用的功能,使用更加面向对象,自动管理线程的生命周期)
相关文章推荐
- Java多线程相关知识
- java学习--多线程相关知识
- Python 多线程相关知识学习
- 关于pyhton多线程的相关知识集合
- 知识储备—01-进程,线程,多线程相关总结
- 多线程相关知识
- Android多线程相关知识总结——源码分析
- C#多线程和socket的相关知识
- 多线程相关知识梳理
- 多线程相关知识
- (6) Java多线程 线程状态等相关知识(含单例懒汉式饿汉式)
- java 多线程相关知识
- C# 多线程、异步线程、线程池相关知识
- 了解一些多线程相关的知识
- 详细讲解在实例中.NET多线程执行函数相关知识
- 多线程相关知识(2015年 10月28号 (更新))
- C# 多线程、异步线程、线程池相关知识
- C# 多线程、异步线程、线程池相关知识
- java多线程相关知识
- 多线程相关知识