zoukankan      html  css  js  c++  java
  • [Objectoriented] : 线程

    前言 :

    线程
    在面向对象里是很少被讨论到的东西。
    不是因为面向对象没有用到线程,而是因为线程是面向对象底层的程序设计的内容。
    或者是换个角度说。线程是所有程序设计开发应该懂的内容,开发出来的程序都是在线程上面执行。
    笔者试着从计算器物理层面,来解释线程的运作。

    单线程 :

    在[Object-oriented] 相关系列的文章中,已经阐述过,
    程序的执行时其实是,
    可以这样理解 :

    image

    程序代码在内存内,然后由计算机一行一行去执行。
    这一行一行执行串联起来的动作,其实就是所谓的线程。
    也就是说图中红线的部分就是最简单的单线程。

    多线程 :

    多线程主要是用在有些时候很多工作要一起执行,而不是执行完一个在去执行下一个。
    理想上可以把多线程,看成有多个单线程一起执行。
    可以这样理解 :

    image

    但是受限各种软硬件的限制,计算机一次只能执行一行程序代码。
    于是工程师们在计算机系统内多加了一个分工器。
    这个分工器的工作,就是让计算机执行完A线程的一行程序代码之后,改去执行B线程的一行程序代码。
    可以这样理解 :

    image
    image
    image
    image

    因为是轮流执行每个线程的一行程序代码,在快速的切换下感觉就会像是同时执行。
    这也就是最基本的多线程雏型。

    这边倒是要特别说明,分工器只是一个观念。
    在实做上,
    有分是用硬件去实现、或是用软件去实现,甚至多核心该怎么实现。
    也有分是一次执行一行程序代码、或是一次执行几秒,来做切换到下一条线程的动作。
    这些是比较进阶的知识,彷间有不少文章都有做详细的说明。

    窗口线程 :

    窗口线程就是我们一般常见到的WindowForm应用程序用的线程。
    WindowForm应用程序有很多又要描绘画面,又要接受鼠标键盘等硬件装置的输入。
    这些工作都是要同时进行操做起来才会顺畅,但是为了这个建立多线程又会让程序变得太复杂。
    于是工程师们在窗口应用程序内,以单线程为基础并且多加了一个讯息帮浦。
    这个讯息帮浦的工作,就是让计算机将要执行的事先存起来,然后有空的时候再去取出来执行。
    可以这样理解 :

    image
    image
    image

    窗口线程的这种做法,让单线程也可以完成多线程的部分工作。
    其实这也是一个好用的线程Pattern,开发的时候拿来套用,可以降低不少多线程的复杂度。

    后记 :

    本篇的文章,
    描述了线程的运作,希望对大家有帮助^^

    P.S.
    本篇的内容大幅度的简化了计算器结构的内容,用以传达线程的概念。
    实际计算机系统在运作的时候,比本篇说明的复杂很多 ^^"。

  • 相关阅读:
    2020年秋招联发科小米等20家公司面经总结
    一个普通硕士生的2020秋招总结(文末送福利)
    Linux内核中container_of宏的详细解释
    拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
    UWB硬件设计相关内容
    SpringToolSuit(STS)添加了Lombok后仍然报错
    Spring Boot整合Mybatis出现错误java.lang.IllegalStateException: Cannot load driver class:com.mysql.cj.jdbc.Driver
    Word快捷选取
    微服务下的用户登录权限校验解决方案
    Spring Boot 使用Mybatis注解开发增删改查
  • 原文地址:https://www.cnblogs.com/clark159/p/2205042.html
Copyright © 2011-2022 走看看