ios29--多线程

简介:

进程是指在系统中正在运行的一个应用程序(一个程序可以对应多个进程)。
每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
比如同时打开迅雷、Xcode,系统就会分别启动2个进程。
1个进程要想执行任务,必须得有线程(进程是线程组成的,进程的所有任务都是线程完成的,每1个进程至少要有1条线程)。
1个线程中任务的执行是串行的。线程是串行的(一个一个的执行的),要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务,也就是说,在同一时间内,1个线程只能执行1个任务。

 


进程和线程的比较:
1.线程是CPU调用(执行任务)的最小单位。
2.进程是CPU分配资源和调度的单位。(cpu在分配资源是按进程为单位进行分配的,不会按照线程为单位进行分配。但是进程中的任务是线程完成的,所以线程是cpu执行的最小单位)。
3.一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程。
4.同一个进程内的线程共享进程的资源

 


多线程:
1.1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务.(线程内部是串行的,但是线程和线程是可以同时进行的)。
2.进程 —— 车间,线程 —— 车间工人
3.多线程技术可以提高程序的执行效率

 


多线程的原理:
1.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
2.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
3.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象(多核CPU就是真正的多线程了)
4.线程过多会造成cpu切换消耗过大(切换需要保存上下文),cpu累死。通常3-5个线程就可以了。

 

多线程的优缺点:
多线程的优点:
1.能适当提高程序的执行效率,能适当提高资源利用率(CPU、内存利用率)。

多线程的缺点:
1. 创建线程是有开销的(空间开销,时间开销),iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间。
如果开启大量的线程,会降低程序的性能。
线程越多,CPU在调度线程上的开销就越大。
2. 程序设计更加复杂:比如线程之间的通信、多线程的数据共享(数据安全)。


主线程:
一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”。
主线程的主要作用:显示\刷新UI界面,处理UI事件(比如点击事件、滚动事件、拖拽事件等)。
主线程的使用注意:别将比较耗时的操作放到主线程中,耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验。

子线程:将耗时操作放在子线程(后台线程、非主线程)。

 

复制代码
//
//  ViewController.m
//  01-了解-耗时操作
//
//  Created by xiaomage on 16/2/18.
//  Copyright © 2016年 小码哥. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.获得主线程,主线程是不能手动开启的,主线程只有一个,是系统开启的,
    NSThread *mainThread = [NSThread mainThread];
    NSLog(@"%@",mainThread);// <NSThread: 0x608000066140>{number = 1, name = main}
    
    //2.获得当前线程,如果没有开启线程,默认就是主线程。
    NSThread *currentThread  = [NSThread currentThread];
    NSLog(@"%@",currentThread);//<NSThread: 0x608000066140>{number = 1, name = main}

    
    //3.判断主线程
    //3.1 number  == 1
    //3.2 类方法
    BOOL isMainThreadA = [NSThread isMainThread];
    //3.3 对象方法
    BOOL isMainThreadB = [currentThread isMainThread];
    NSLog(@"%zd---%zd",isMainThreadA,isMainThreadB);//1,1
}

- (IBAction)btnClick:(id)sender {//按钮的点击事件是主线程处理的。
    
    for (NSInteger i = 0; i <10000; i++) {
        NSLog(@"%zd----%@",i,[NSThread currentThread]);//主线程进入这个方法,耗时,主线程出不来,此时外面的其他UI控件不能点击了。
    }
    
}



@end
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7488617.html,如需转载请自行联系原作者

相关文章
|
19天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
2月前
|
安全 测试技术 调度
iOS开发-多线程编程
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),保持对象不被释放;`weak`(弱引用),不保持对象,有助于避免循环引用;`assign`(赋值),适用于基本数据类型及非指针对象类型;`copy`(复制),复制对象而非引用,确保不变性。内存管理基于引用计数,利用自动引用计数(ARC)自动管理对象生命周期。此外,需注意避免循环引用,特别是在block中。最佳实践包括理解各策略、避免不必要的强引用、及时释放不再使用的对象、注意block中的内存管理,并使用工具进行内存分析。正确管理内存能显著提升应用质量。
|
2月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
2月前
|
编译器 C语言 iOS开发
iOS 16 系统键盘修复问题之确定_lock是否用于保护对_deferredTasks的多线程读写如何解决
iOS 16 系统键盘修复问题之确定_lock是否用于保护对_deferredTasks的多线程读写如何解决
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
390 0
|
5月前
|
iOS开发
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
114 1
|
5月前
|
API 调度 iOS开发
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
60 1
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
822 1
|
安全 算法 编译器
iOS线程安全——锁(二)
iOS线程安全——锁(二)
139 0
|
存储 安全 API
iOS线程安全——锁(一)
iOS线程安全——锁(一)
240 0