进程是指在系统中正在运行的一个应用程序(一个程序可以对应多个进程)。
每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
比如同时打开迅雷、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的流畅度,给用户一种“卡”的坏体验。

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

  1. //
  2. // ViewController.m
  3. // 01-了解-耗时操作
  4. //
  5. // Created by xiaomage on 16/2/18.
  6. // Copyright © 2016年 小码哥. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10.  
  11. @interface ViewController ()
  12.  
  13. @end
  14.  
  15. @implementation ViewController
  16.  
  17. - (void)viewDidLoad {
  18. [super viewDidLoad];
  19.  
  20. //1.获得主线程,主线程是不能手动开启的,主线程只有一个,是系统开启的,
  21. NSThread *mainThread = [NSThread mainThread];
  22. NSLog(@"%@",mainThread);// <NSThread: 0x608000066140>{number = 1, name = main}
  23.  
  24. //2.获得当前线程,如果没有开启线程,默认就是主线程。
  25. NSThread *currentThread = [NSThread currentThread];
  26. NSLog(@"%@",currentThread);//<NSThread: 0x608000066140>{number = 1, name = main}
  27.  
  28. //3.判断主线程
  29. //3.1 number == 1
  30. //3.2 类方法
  31. BOOL isMainThreadA = [NSThread isMainThread];
  32. //3.3 对象方法
  33. BOOL isMainThreadB = [currentThread isMainThread];
  34. NSLog(@"%zd---%zd",isMainThreadA,isMainThreadB);//1,1
  35. }
  36.  
  37. - (IBAction)btnClick:(id)sender {//按钮的点击事件是主线程处理的。
  38.  
  39. for (NSInteger i = ; i <; i++) {
  40. NSLog(@"%zd----%@",i,[NSThread currentThread]);//主线程进入这个方法,耗时,主线程出不来,此时外面的其他UI控件不能点击了。
  41. }
  42.  
  43. }
  44.  
  45. @end

ios29--多线程的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  5. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  6. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  7. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  8. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  9. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  10. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

随机推荐

  1. Servlet中的几个重要的对象(转)

    讲解四大类,ServletConfig对象,ServletContext对象.request对象,response对象 ServletConfig对象 获取途径:getServletConfig(); ...

  2. [Python3网络爬虫开发实战] 5.2-关系型数据库存储

    关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录.表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之 ...

  3. 零基础入门学习Python(22)--函数:递归是神马

    知识点 递归是神马? 递归是属于算法的范畴. 递归就是函数调用自身的一种行为. >>> def g(): return g() >>> g() Traceback ...

  4. 简述FTP主动模式与被动模式

    1 FTP工作模式 2 不同模式FTP面临的问题 3 主动模式的FTP连接建立连接主要步骤 客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号 ...

  5. 【数据库】DML-增删改查-SQL实现

    一.数据插入-Insert 1. 插入单条记录 insert into 表名(字段名,字段名,字段名) //当插入所有字段时,字段名可以省略 values('值1','值2','值3'); 2. 插入 ...

  6. C语言《一维数组的学习,冒泡排序》

    #include<stdio.h> /* 一维数组的学习,冒泡排序 soulsjie 20170623 */ void main(){ int a[6]; int i,j,k; print ...

  7. [bzoj1895][Pku3580]supermemo_非旋转Treap

    supermemo bzoj-1895 Pku-3580 题目大意:给定一个n个数的序列,需支持:区间加,区间翻转,区间平移,单点插入,单点删除,查询区间最小值. 注释:$1\le n\le 6.1\ ...

  8. 2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

    题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k < ...

  9. Android GIS开发系列计划

    本系列博客的整理与写作计划如下,计划3个月(至2018.2)完成. 第一部分, 入门季 第二部分, Android基础季 第三部分, Data Flow 季 第四部分, 可视化季 第五部分, GIS常 ...

  10. FDMemTable内存表操作

    unit Umemtable; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System ...