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 = ; i <; i++) {
NSLog(@"%zd----%@",i,[NSThread currentThread]);//主线程进入这个方法,耗时,主线程出不来,此时外面的其他UI控件不能点击了。
} } @end
ios29--多线程的更多相关文章
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java多线程
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
随机推荐
- egg.js上传文件到本地
'use strict'; const Service = require('egg').Service; const fs = require('fs'); const path = require ...
- MySQL 日志初探
目录 MySQL 日志初探 零.概述 一.Error Log(错误日志) 二.General Query Log(通用查询日志) 三.Slow Query Log (慢查询日志) 四.Binary L ...
- [Python3网络爬虫开发实战] 1.6.1-Flask的安装
Flask是一个轻量级的Web服务程序,它简单.易用.灵活,这里主要用来做一些API服务. 1. 相关链接 GitHub:https://github.com/pallets/flask 官方文档:h ...
- STM32F407 串口通信实验 第26节 个人笔记
前言 这篇笔记对应正点原子STM32F407探索者 ,教学视频第26节,网址如下: https://ke.qq.com/webcourse/index.html#cid=279403&term ...
- python gdal库安装
yum安装了postgis之后,会安装依赖gdal centos7.5的repo中gdal为1.11.4-3版本
- window.onload 函数不执行处理
Google Chrome window.onload = function(){} 函数不执行处理 function pageOnLoad(){} window.onload = pageOnL ...
- Netbeans工具使用记录
#自动换行设置 工具->选项->编辑器->格式设置
- 2018/3/3 解析ThreadLocal源码
今天听到一个老哥说道ThreadLocal在源码设计上面的一些好处,于是决定把ThreadLocal源码彻底分析一下. 首先,我们来看下set方法 可以看到,这个方法里,先获得了当前线程,之后将当前线 ...
- Ubuntu12.04之修改密码
Ubuntu 12.04 默认root没有密码 修改密码方式如下: test@localhost:~$ sudo passwd root [sudo] password for test: 输入新的 ...
- 加上mvc:resources后controller访问404
之前因为静态资源访问,404,于是加上了类似的代码 <mvc:resources location="/resources/" mapping="/resource ...