[Objectoriented] : 线程

前言 :

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

单线程 :

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

image

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

多线程 :

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

image

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

image
image
image
image

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

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

窗口线程 :

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

image
image
image

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

后记 :

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

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

原文地址:https://www.cnblogs.com/clark159/p/2205042.html