类多线程的单线程之探索多线程

类多线程的单线程之探索多线程 | Gragon Atlas

——关于对多线程实现机制的探索

        在第一次接触多线程的时候,很多小伙伴可能知道多个线程可以并发工作,但是不知道多线程实现的本质。如果让一个刚刚学多线程的同学写一个运动的小球,那么大概他会先写一个界面:

        然后是监听器,监听那个按钮

        然后是线程

    然后效果就是

图一

图二

图三

        结果是,不仅小球的颜色会改变,而且还会留下其他小球颜色的“残影”,那么这到底是为什么呢?

        通过分析java多线程的实现,我们可以提出这么一个假设,假设其实程序在一瞬间只能执行一个任务,但是它可以将多个任务分解成一个个碎片,按照一定的顺序轮流执行。由于这个“一瞬间”十分短暂,对于人类来说,这样的方式执行的效果几乎就是多个任务同时进行。如果是这样,就可以非常好的解释了这个现象。现在我们来用假设和实验事实互相证明: 这个是绘制的代码:

        当线程1执行到①的时候,系统切换到了线程2,线程2也执行了①,由于我之前设定的是每个球的颜色是随机的,所以当系统切换回线程1的时候,再去执行①后面语句时,画出来的球的颜色就和线程②的小球是一样的了,这也就是为什么图二里面最左边的球颜色会变成最右边的球的颜色了。

        当线程1执行到②的时候,系统又切换到了线程2,线程2执行了①,然后当系统再次切换回线程1的时候,本来执行②后面的语句来抹去上一个球,但是由于颜色变成了线程2的小球的颜色,便画出了一个颜色和线程2小球一样的影子。

        这个实例告诉我们,其实多线程不是完全同时进行的,电脑也无法在同一时刻做那么多任务,所以当多个线程按照特定的权打成碎片,系统按照一定顺序轮流完成碎片,这便是我们看到的多线程。知道事实的我们是不是可以自己动手模仿着写一个类似功能的算法呢?