线程与循环的区别?

今天看了csdn上一楼主说了这么一个问题,说循环和线程有什么区别,线程还耗费资源,相对循环运行慢,为什么还要用线程呢,这个问题看完之后,一下子出了一大堆无脑评论,说线程怎么可能慢呢,说楼主没经过大脑想问题,还有说让楼主多看书的,其实我书看的也不多,大学还没毕业,正准备找工作,但是线程我用过,这个东西我也大致明白些,在这里卖弄一下,大家如果觉得我说的有问题不妨说说自己的看法,我最初用线程是在学Java做课程设计,我当时就给自己下目标做一个打飞机的小游戏,当时我身边的同学几乎没人敢用线程,这个东西自打老师讲就没太注重,而且是大家公认的难以理解的领域,自己瞎捅咕了一个多月,也没弄明白这个线程怎么加,最后程序总算写完了,但是闪烁的非常厉害,我知道这个是双缓冲的问题,但是当时到处问也没有得到答案,所以就那么地了,线程总共就加了一个,一个死循环,直到按esc就设定一个标志变量,就break掉,老师看了还挺满意,没说啥,就是说闪烁厉害,但是现在来看,你们说如果我把那个线程改成循环,那个线程的start方法,改成调用一个普通的函数,你们觉得他还能运行吗,可能有人觉得可以一试,但是我直接告诉你,不行,如果这样的话,程序陷入了死循环,想必大家都应该写过死循环的bug吧,一旦出现死循环,程序动不了了,点啥都不好使,程序自己在那里空转,为啥会这样呢,懂得人知道其实我那个程序里虽然只加了一个线程,但是程序运行的时候可不止是一个线程在运转,默认来说一个程序运行会产生一个进程,这个进程里默认有一个主线程,我在里边加了一个线程,这个时候实际上来说是两个线程在交替执行,想想看,这两个线程的运行可以说是独立的,从真正意义上来说,两个线程不可能同时执行,因为我们的电脑多数只有一个CPU,所谓多核,大家不妨上网查一下,多核可不意味着多个CPU,一块CPU在一个时刻只能运行一个程序,所以说,这个线程其实一定是同步的,我这个说法可能您不理解,那为什么还要引入同步和异步的概念呢,在我认为这个就有点像我们学的相对论了,看你怎么说,同步的概念很简单,就是甲和乙一前一后,甲走一步,乙在后边也跟着走一步,二者在进度上保持着同等的差异,遵循着一定的规律,相互是有制约关系的,而异步呢,异步本意是两个人同时走,一起走,谁也不让谁,但是我刚才说过只有一个CPU,不可能两个人能同时在走,但是我们可以模拟嘛,系统会给我们虚拟出这样的条件,甲走一块,乙虽然不能一起走,但是乙可以在甲那一步还没走完赶紧跟上一步,似乎是做到了异步(可以说是在不同调度下的同步,我说的相对论就是相对这个资源使用方面来说的,下面我具体说),在电脑上来说,我们经常提到的资源互斥问题就实际上就是异步在调度的过程中,他们所使用的资源,其他的线程也可以访问,但是问题就出在甲线程没把问题解决完,我们一般定义的变量都保存在栈里,这里我就不细说堆和栈的区别了,这个问题可能是需要一个变量来控制的,但是呢,这个变量恰巧可能是全局变量,导致在另一个乙线程中也用到了他,所以出问题了,乙也没做完,但是关键是乙把变量的值给改了,怎么办,甲想要的是之前没改的数据,但是值被覆盖掉了,这个情况就是异步导致的问题,看到了吧,异步其实只是个概念,他并没有真正的实现所谓的一起执行,可能您要问了,异步这么说他没给我们带来一丝便利,净找麻烦了,这个问题用同步完全就可以解决掉,我们只要让甲线程把问题解决完,直到他认为这个资源对他没啥价值了,就可以分配给乙线程了,这样就可以了,但是这个同步我们仔细想想,完全可以自己来控制嘛,只要写个循环加几条判断就可以了,没错,真的可以这样,但是Java里边把这个调度的机制都写好了,你不用,非得自己写,这个想法是好的,但是真的没必要,这个也正是线程在我们写代码时的作用,他就是一个循环,但是我要强调一点,您写代码只能模拟同步,异步您还真不能自己写,可能我还没学的那么深,不过就我现在学到的来看,我们能自己实现的也就是同步,异步来说我们净看到缺点了,他就没有优点吗,有的,不过这里异步可必须要真正的实现我所说的异步,不能有只是去模拟,就是说甲和乙一定要真正的一起走,这个情况举个例子就是操作系统里的DMA,可能有些人没听过,简单来说,就是CPU和IO的关系,CPU并不是一直关注着IO的,其实实际上IO一直处于托管状态,就像我们使用的打印机,电脑只要告诉他要打印了,打印什么发送到打印机缓存,就可以干别的事了,打印机自己有类似CPU的处理器,他自己会调度,这个处理机制就是DMA,所以这个异步的优点立刻就凸显出来了,CPU干自己的,要保存或需要什么数据,采用异步告诉IO一声就好了,两个人就可以共同工作了,实现了高效率,这个在安卓里是必须这么做的,好了,同步异步基本就是这个概念,回到刚才的问题,为什么把线程改成循环键盘就按不动了(我是说在只是在那个程序里),原因就是CPU在忙,就在忙那个死循环了,出不来,而再加一个线程呢,一个线程出现死循环,另一个线程还可以正常运行啊,默认线程是主线程,这个主线程就是控制我们键盘监听事件的处理的,您要是在主线程里加了死循环,他就没时间管理这个键盘监听了,所以点啥都不好使。

  问题说的差不多了,我们使用线程主要目的就是要使用Java内部的管理机制,简化我们的代码,所以说用线程会造成一定的开销,我们是可以理解的,但是如果有IO,或者其他外设有自主处理功能的,这样做还可以明显提高我们处理事件的效率。

原文地址:https://www.cnblogs.com/xiatianyu/p/thread_loop_different.html