今天看了csdn上一樓主說了這么一個問題,說循環和線程有什么區別,線程還耗費資源,相對循環運行慢,為什么還要用線程呢,這個問題看完之后,一下子出了一大堆無腦評論,說線程怎么可能慢呢,說樓主沒經過大腦想問題,還有說讓樓主多看書的,其實我書看的也不多,大學還沒畢業,正准備找工作,但是線程我用過,這個東西我也大致明白些,在這里賣弄一下,大家如果覺得我說的有問題不妨說說自己的看法,我最初用線程是在學Java做課程設計,我當時就給自己下目標做一個打飛機的小游戲,當時我身邊的同學幾乎沒人敢用線程,這個東西自打老師講就沒太注重,而且是大家公認的難以理解的領域,自己瞎捅咕了一個多月,也沒弄明白這個線程怎么加,最后程序總算寫完了,但是閃爍的非常厲害,我知道這個是雙緩沖的問題,但是當時到處問也沒有得到答案,所以就那么地了,線程總共就加了一個,一個死循環,直到按esc就設定一個標志變量,就break掉,老師看了還挺滿意,沒說啥,就是說閃爍厲害,但是現在來看,你們說如果我把那個線程改成循環,那個線程的start方法,改成調用一個普通的函數,你們覺得他還能運行嗎,可能有人覺得可以一試,但是我直接告訴你,不行,如果這樣的話,程序陷入了死循環,想必大家都應該寫過死循環的bug吧,一旦出現死循環,程序動不了了,點啥都不好使,程序自己在那里空轉,為啥會這樣呢,懂得人知道其實我那個程序里雖然只加了一個線程,但是程序運行的時候可不止是一個線程在運轉,默認來說一個程序運行會產生一個進程,這個進程里默認有一個主線程,我在里邊加了一個線程,這個時候實際上來說是兩個線程在交替執行,想想看,這兩個線程的運行可以說是獨立的,從真正意義上來說,兩個線程不可能同時執行,因為我們的電腦多數只有一個CPU,所謂多核,大家不妨上網查一下,多核可不意味着多個CPU,一塊CPU在一個時刻只能運行一個程序,所以說,這個線程其實一定是同步的,我這個說法可能您不理解,那為什么還要引入同步和異步的概念呢,在我認為這個就有點像我們學的相對論了,看你怎么說,同步的概念很簡單,就是甲和乙一前一后,甲走一步,乙在后邊也跟着走一步,二者在進度上保持着同等的差異,遵循着一定的規律,相互是有制約關系的,而異步呢,異步本意是兩個人同時走,一起走,誰也不讓誰,但是我剛才說過只有一個CPU,不可能兩個人能同時在走,但是我們可以模擬嘛,系統會給我們虛擬出這樣的條件,甲走一塊,乙雖然不能一起走,但是乙可以在甲那一步還沒走完趕緊跟上一步,似乎是做到了異步(可以說是在不同調度下的同步,我說的相對論就是相對這個資源使用方面來說的,下面我具體說),在電腦上來說,我們經常提到的資源互斥問題就實際上就是異步在調度的過程中,他們所使用的資源,其他的線程也可以訪問,但是問題就出在甲線程沒把問題解決完,我們一般定義的變量都保存在棧里,這里我就不細說堆和棧的區別了,這個問題可能是需要一個變量來控制的,但是呢,這個變量恰巧可能是全局變量,導致在另一個乙線程中也用到了他,所以出問題了,乙也沒做完,但是關鍵是乙把變量的值給改了,怎么辦,甲想要的是之前沒改的數據,但是值被覆蓋掉了,這個情況就是異步導致的問題,看到了吧,異步其實只是個概念,他並沒有真正的實現所謂的一起執行,可能您要問了,異步這么說他沒給我們帶來一絲便利,凈找麻煩了,這個問題用同步完全就可以解決掉,我們只要讓甲線程把問題解決完,直到他認為這個資源對他沒啥價值了,就可以分配給乙線程了,這樣就可以了,但是這個同步我們仔細想想,完全可以自己來控制嘛,只要寫個循環加幾條判斷就可以了,沒錯,真的可以這樣,但是Java里邊把這個調度的機制都寫好了,你不用,非得自己寫,這個想法是好的,但是真的沒必要,這個也正是線程在我們寫代碼時的作用,他就是一個循環,但是我要強調一點,您寫代碼只能模擬同步,異步您還真不能自己寫,可能我還沒學的那么深,不過就我現在學到的來看,我們能自己實現的也就是同步,異步來說我們凈看到缺點了,他就沒有優點嗎,有的,不過這里異步可必須要真正的實現我所說的異步,不能有只是去模擬,就是說甲和乙一定要真正的一起走,這個情況舉個例子就是操作系統里的DMA,可能有些人沒聽過,簡單來說,就是CPU和IO的關系,CPU並不是一直關注着IO的,其實實際上IO一直處於托管狀態,就像我們使用的打印機,電腦只要告訴他要打印了,打印什么發送到打印機緩存,就可以干別的事了,打印機自己有類似CPU的處理器,他自己會調度,這個處理機制就是DMA,所以這個異步的優點立刻就凸顯出來了,CPU干自己的,要保存或需要什么數據,采用異步告訴IO一聲就好了,兩個人就可以共同工作了,實現了高效率,這個在安卓里是必須這么做的,好了,同步異步基本就是這個概念,回到剛才的問題,為什么把線程改成循環鍵盤就按不動了(我是說在只是在那個程序里),原因就是CPU在忙,就在忙那個死循環了,出不來,而再加一個線程呢,一個線程出現死循環,另一個線程還可以正常運行啊,默認線程是主線程,這個主線程就是控制我們鍵盤監聽事件的處理的,您要是在主線程里加了死循環,他就沒時間管理這個鍵盤監聽了,所以點啥都不好使。
問題說的差不多了,我們使用線程主要目的就是要使用Java內部的管理機制,簡化我們的代碼,所以說用線程會造成一定的開銷,我們是可以理解的,但是如果有IO,或者其他外設有自主處理功能的,這樣做還可以明顯提高我們處理事件的效率。