iOS多线程编程

来源:互联网 发布:抚仙湖水下古城 知乎 编辑:程序博客网 时间:2024/06/08 15:25

多线程

指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作线程Thread),利用它编程的概念就叫作多线程处理(Multithreading。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。


多线程操作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。

如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。举个例子来说,两个线程不能将信息同时发送给一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。


多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。


优点:

1.使用线程可以把占据时间长的程序中的人物放到后台中取处理

2.用户界面可以更加吸引人,这样比如用户点击了一个按钮取触发某些事件的处理,可以弹出一个嫉妒条来显示处理的进度

3.程序的运行速度可能加快

4.在一些等待的人物实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。


缺点:

1.如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换。

2.更多的线程需要更多的内存空间

3.线程可能会给程序带来更多的bug,因此要小心使用

4.线程的中止需要考虑其对程序运行的影响

5.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。



IOS支持三个层次的线程编程,从底层到高层(层次越高使用越方便,越简洁)分别是:

    1.Thread

    2.Cocoa Operations

    3.Grand Central Dispatch




Pthread

    //创建pthread对象,启动一个子线程

    pthread_tpthread;

    /**第三个参数:子线程任务的方法名字

     第四个参数:传递给task函数的参数 (void *)

     */

    char *data = "hello";

    int threadError =pthread_create(&pthread, NULL, task, data);

    if (threadError != 0) {

        NSLog(@"线程创建失败");

    }




NSThread


- (void)downloadImage {

    NSLog(@"线程:%@",[NSThread currentThread]);

    //延迟一段时间 (s)

    [NSThread sleepForTimeInterval:5];

    //耗时操作(下载图片)

    for (int i = 0; i < 10; i++) {

        NSLog(@"执行次数:%d", i);

        //手动地退出正在执行的逻辑

        if (i == 5) {

            //退出

            [NSThread exit];

        }

    }

}

使用init方式创建子线程

    //使用频率相对高

    //创建NSThread对象(指定子线程任务)

    NSThread *thread = [[NSThread alloc] initWithTarget:selfselector:@selector(downloadImage) object:nil];

    //设置线程属性(优先级/名字)

    //优先级:0~1 (值越大,优先级越高)

    [thread setThreadPriority:0.5];

    [thread setName:@"线程一"];

    //手动启动子线程

    [thread start];


使用detach方式创建子线程

    //方式二:使用detach类方法来创建NSThread线程对象,并执行子线程的任务

    //适用场景:只是单纯创建NSThread子线程对象,自动执行

    [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil];


使用perform方式创建子线程

    //方式三:iOS9过期 (启动了一个新子线程来执行downloadImage)

    [self performSelectorInBackground:@selector(downloadImage) withObject:nil];


NSLock(线程互斥排他锁)

    NSLock *ticketLock;

    [self.ticketLocklock];

    [self.ticketLockunlock];


NSCondition

NSCodition 是一种特殊类型的锁,我们可以用它来同步操作执行的顺序。等待某个 NSCondtion的线程一直被lock,直到其他线程给那个condition发送了信号。

    condition = [[NSCondition alloc] init];

    [conditionlock];//上锁

    [condition wait];//等待信号

    [condition signal];//发送信号

    [condition unlock];//解锁

0 0
原创粉丝点击