zoukankan      html  css  js  c++  java
  • 线程和多线程(二)

    概述

    多线程的概念在各个操作系统上都会接触到,windows、Linux、mac os等等这些常用的操作系统,都支持多线程的概念。

    当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的。

    之前简单介绍了下单线程和多线程,下面再对单线程和多线程做下补充。

    一、程序、进程、线程的区别

    二、单线程

    三、多线程

    四、单线程和多线程的区别

    五、多线程的作用

    1、多线程的作用

    相信有过开发经验的程序员都知道,当我们把代码写完后,程序是一行一行逐行执行代码的,当其中一行代码需要执行较长时间(例如select一个教复杂的语句或者较多的数据时),那么程序就会出现卡顿的现象,不会响应用户的操作。

    因为开启程序后会默认开启一个主线程,即UI线程。当处于刚才那种情况时,比如一个windows程序,就会出现程序暂时无响应的提示,好像电脑卡主的感觉,这是非常不好的一种用户体验。

    当我们要避免这种情况的时候,最好的方式就是多线程,开启一个新的线程,用来执行一个耗时的操作,执行完成后再让主线程来修改UI页面(如果需要的话)。

    既多线程可以解决负载均衡问题,充分利用CPU资源,为了提高可CPU的使用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

     

    2.多线程的原理

     

    同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
    多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
    如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
    思考:如果线程非常非常多,会发生什么情况?
    CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
    每条线程被调度执行的频次会降低(线程的执行效率降低)

     

    3.多线程的优缺点

     

    多线程的优点

    能适当提高程序的执行效率

    能适当提高资源利用率(CPU、内存利用率)

     

    多线程的缺点

    开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能

    线程越多,CPU在调度线程上的开销就越大

    程序设计更加复杂:比如线程之间的通信、多线程的数据共享

     

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

    主线程:一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”

    主线程的主要作用

    显示刷新UI界面

    处理UI事件(比如点击事件、滚动事件、拖拽事件等)

     

    主线程的使用注意:别将比较耗时的操作放到主线程中。

    耗时操作会卡住主线程,严重影响UI的流畅度,给用户一种“卡”的坏体验 

    5、用到多线程的地方

    在很多时候我们呢可能没有用到多线程,或者不清楚什么时候用多线程,那么在什么地方会用到多线程呢?

    大多情况下,要用到多线程的主要是需要处理大量的IO操作时或处理的情况需要花大量的时间等等,比如:读写文 件、视频图像的采集、处理、显示、保存等。 

    6、iOS有三种主要的实现多线程的方法

    1、NSThread。2、NSOperation。3、GCD。 

     

    7、多线程安全的解决方案

    使用锁:锁是线程编程同步工具的基础。锁可以让你很容易保护代码中一大块区域以便你可以确保代码的正 确性。

    1、使用POSIX互斥锁;

    2、使用NSLock类;

    3、使用@synchronized指令等。 

    互斥锁的优缺点

    优点:能有效防止因多线程抢夺资源造成的数据安全问题

    缺点:需要消耗大量的CPU资源

     

    互斥锁的使用前提:多条线程抢夺同一块资源 

    相关专业术语:线程同步,多条线程按顺序地执行任务

    互斥锁,就是使用了线程同步技术

     

    1、创建NSThread的两种方式

     

  • 相关阅读:
    怎样为flash配置Alcon调试工具
    8.9Go简介
    8.14GO之条件语句
    8.10Go之基础语法
    8.11Java之数组知识回顾
    8.13Go之常量
    8.10Go执行流、编译、特点、转义字符
    8.14Go之运算符(Operator)
    8.14Java之使用HttpClient类通过POST方式上传文件
    8.10Go之语言数据类型
  • 原文地址:https://www.cnblogs.com/496668219long/p/4643179.html
Copyright © 2011-2022 走看看