“你好,阿米戈!我们遇到一个非常难的新主题。很抱歉。它不仅在 Java 中通常被认为是最复杂的主题之一,而且在一般的编程中也是如此。我说的是多线程。”

想象一个典型的计算机游戏,例如宇宙飞船竞赛游戏。你正在飞越广阔的宇宙,同时躲避着陨石和巡逻巡洋舰。还有其他二十多个人正在和你一起参与这些非法竞赛。

假设你决定编写这样一个游戏。你的程序将必须跟踪命令(键盘输入),移动宇宙飞船,计算它们的轨迹,确定任何碰撞的结果,并在用户屏幕上绘制所有这一切。这是一项非常复杂的工作。

还记得我们在有关成长型运输公司的示例中是如何解决“极端复杂问题”的吗?

我们将该公司划分为独立的部门,并严格指定(标准化)它们之间的交互方式。

“但是当独立的部分必须与其他部分并行执行某些工作时,我们该怎么做?!此问题的答案是线程。”

试着将程序想象成运行代码并执行命令小型机器人。首先,它在一行上执行一条命令,然后移至下一行,依此类推。

“我能够想象出来。非常简单!”

“很好。现在,假设你有几个这样的机器人。一个处理用户输入,第二个根据该输入更新对象。第三个执行代码以在屏幕上显示这些对象。第四个每秒钟检查几次是否有任何飞船相撞,如果有,则计算碰撞的结果。”

这样,我们不仅可以将程序划分为独立的部分/对象,还可以使这些部分相互独立地执行工作。各个部分之间的交互越少,程序复杂性越低。

想象一下,你能够用发送字母的脚本替代经理。公司的其他部门甚至都察觉不到有什么变化。这种事情早在 26 世纪就已发生,并取得了优异的成果。大多数经理,甚至高层管理人员,都可以被平均复杂程度的脚本成功替代。只有在“办公室浮游生物工会”介入之后,经理的大规模裁员才会告一段落。不过这个话题就扯远了。

“太有趣了!”

“这些‘小型机器人’当中不仅有几个可以执行代码,它们还可以相互交流并生成新的机器人。”

“生成新的机器人?”

“是的,用于执行新任务。有时,创建另一个机器人(另一个线程)以便与当前线程(机器人)同时执行某些操作会有很多优势。”

这听起来不错,但我想不出用于什么场合。

我们为什么称之为“线程”?

“想象一下,每个机器人都有不同的颜色,并在执行命令时用其颜色标记命令。小型机器人所走的路径就像铅笔划过的线。这条路径在机器人后面连起来,就像针后面的线一样。”

每个“小型机器人”都有一个与生俱来的任务。你可以认为线程是执行此任务时执行的命令集。

假设你正乘坐宇宙飞船运送货物。“运送货物”是你的任务,而你正在执行此任务。而你的飞行路线就是你的线程。我们可以说,每个新任务,每个尚未完成的任务,都有其自己的线程(仍需遍历的路径)。

“换句话说,有一个任务和一个执行该任务的‘小型机器人’。线程就是机器人在完成任务时所走的路径吗?”

“完全正确。”

这就是它内部的工作原理。由于计算机只有一个处理器,因此一次只能执行一个命令。因此实际情形如下:处理器不断地在线程之间切换。它切换到一个新线程,执行几个命令,然后切换到下一个线程,再执行几个命令,依此类推。但是由于每秒发生数百次线程切换,因此在我们看来,所有线程都在同时运行。

多线程 - 1