iOS开发基础34-多线程

在现代计算机和移动应用程序的开发过程中,进程与线程是两个基础而关键的概念。

一、进程和线程

1. 什么是进程

进程 是系统中正在运行的一个应用程序实例。每个进程都运行在其专用且受保护的内存空间内,进程之间是独立的,互不干扰。系统资源 (如 CPU 时间、内存) 是分配给进程的。

例如,当我们同时打开迅雷和 Xcode 时,系统分别为这两个应用程序启动两个独立的进程。可以通过系统自带的“活动监视器”应用查看当前运行的所有进程。

2. 什么是线程

一个进程要执行任务,必须至少有一条 线程。线程是进程中的一个执行路径,一个进程的所有任务都在其内部的线程中进行。

举个例子,当使用酷狗播放音乐和使用迅雷下载电影时,具体的播放和下载任务都是在线程中执行的。

3. 线程的串行

线程内的任务执行是串行的。如果在一个线程中有多个任务,它们将按顺序一个接一个地执行。这就是说,在同一时间内,一个线程只能执行一个任务。因此,线程也可以被认为是进程中的一条执行路径。

二、多线程

1. 什么是多线程

一个进程中可以开启多个线程,让多条线程并行(同时)执行不同任务。这就是 多线程。多线程技术可以提高程序的执行效率,因为不同的任务可以在不同的线程中独立地进行。

2. 多线程的原理

虽然线程可以并行执行,但在一个多核 CPU 中,同一时间内实际只有一个线程在被执行。这些线程通过 CPU 调度 机制被快速地轮流切换,给我们一种多线程并发执行的假象。

如果线程非常多,CPU 需要在大量线程之间频繁调度,这会消耗大量的 CPU 资源,同样降低每个线程被执行的频次,从而降低总体的执行效率。

3. 多线程的优缺点

优点

  • 提高程序执行效率:多线程可以在不增加 CPU 主频的情况下,提高程序的执行效率。
  • 提高资源利用率:多线程可以更充分地利用系统资源,如 CPU 和内存。

缺点

  • 开销:创建和维护线程是有成本的,包括内核数据结构(约 1KB)、栈空间(子线程512KB、主线程1MB)。创建一个线程大约需要 90 毫秒的时间。
  • 性能问题:开启大量线程会降低程序性能,因为 CPU 调度线程的开销会增大。
  • 复杂性:多线程编程更复杂,需要解决线程之间的通信和数据共享问题。

三、应用

1. 多线程在 iOS 开发中的应用

主线程

在一个 iOS 程序中,默认会启动一条线程,称为 主线程UI线程,它的主要职责包括:

  • 显示和刷新 UI 界面
  • 处理 UI 事件(比如点击事件、滚动事件、拖拽事件等)。

重要提示:不要在后台线程尝试更新 UI,这可能会导致不可预期的问题,如崩溃或者 UI 不更新。

主线程的注意事项

不要将耗时操作放在主线程中,因为这样会卡住主线程,影响 UI 的流畅度,给用户一种卡顿的体验。耗时操作应放到子线程中执行。

2. 耗时操作

耗时操作(如网络请求、数据库访问、文件处理等)应放在子线程(后台线程、非主线程)中执行,以确保主线程的流畅性能。

四、iOS 中多线程的实现方案

iOS 提供了多种方法来实现多线程编程,包括:

1. NSThread

NSThread 是最基本的多线程实现方法,可以直接操作线程。使用 NSThread,你可以创建和控制线程的生命周期。

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

2. GCD (Grand Central Dispatch)

GCD 是一种基于 C 语言的底层 API,用于管理和调度任务。它的核心概念是 队列(dispatch queue)。GCD 是 iOS 中最常用的多线程工具。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 你的耗时操作代码
    dispatch_async(dispatch_get_main_queue(), ^{
        // 更新 UI 代码
    });
});

3. NSOperation 和 NSOperationQueue

NSOperationNSOperationQueue 提供了基于面向对象的多线程编程模型,可以更好地控制任务之间的依赖关系和任务的取消操作。

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // 你的耗时操作代码
}];
[operationQueue addOperation:operation];

4. Pthreads

Pthreads 是 POSIX 标准的线程库,提供更底层的线程控制。一般情况下不推荐在 iOS 开发中使用,因为它太复杂且不符合 iOS 常规开发范式。

pthread_t thread;
pthread_create(&thread, NULL, &someFunction, NULL);

结语

多线程的应用在提高程序效率和资源利用率方面有巨大帮助,但也带来了更大的复杂性和管理成本。在 iOS 开发中,合理使用多线程技术(如 GCD 和 NSOperationQueue)可以帮助解决许多性能问题并提升用户体验。然而,必须谨慎设计和管理线程,以避免性能下降和资源过度消耗。通过对进程和线程的深入理解,可以在实际开发中更好地利用这些技术,使应用更加高效和稳定。

posted @ 2015-08-17 20:51  Mr.陳  阅读(298)  评论(0编辑  收藏  举报