您的位置:首页 > 其它

多线程相关知识

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_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多了一些简单易用的功能,使用更加面向对象,自动管理线程的生命周期)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: