JAVA多線程,真的能提高效率嗎


舉個栗子

比如挖一個隧道,有2種開工方法
1、只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單線程

2、在山的兩頭挖,同時開工,最后在山的中間接通,從而打通隧道,這感覺肯定比1快了很多,好比多線程

但是2成立的前提是必須有兩個工人。而我們的計算機中一般來說只有一個CPU,也就是說只有一個工人。
多線程不過是CPU在不同的時間片之間切換,而表現出齊頭並進的樣子。

既然挖隧道的人只有一個,雖然我的施工方案是在山的兩頭開挖,但是由於工作的人只有一個,所以只有讓這個人在山的兩頭跑,挖一會這頭再去挖另一頭,來回跑是要花費額外時間的(好比線程的切換和調度)。

那么,我們是不是可以說,在單CPU的機器中,多線程反而降低了效率呢?

1.

不能一概而論,你的看多線程在你的程序中為啥而生。在單cpu系統,比如有io的等待,多線程的確能提高效率

2.

如果cpu確實是一個挖山工人,且它工作挖2個小時,然后必須休息1小時;這1小時休息期間如果讓它跑到山那頭繼續挖,效率還是很高的。
現在的程序時間大多花在讀取數據上,真正的計算工作花時間還是相對少的,因此cpu很大時間表現都很閑,就像挖土效率高,運土效率低。多線程就是要充分利用它的挖土效率。

3.

pc機不光只一個cpu,cpu和其它硬件設備一起才能完成計算,分工協作,但可能出現其中某個家伙偷懶或效率低,導致大家都等它,閑着的其它設備這個時候可以騰出手來干其它活。單cpu在同一時刻只能干一件事情,這沒有問題,問題是它並不是7*24*3600都在干活,其它設備也是同樣的道理,多線程的目的可以最大限度的提高硬件設備的利用率。

4.
同一個設備可以同時(並行,互不影響)干幾件事情,但同一個設備在同一時刻肯定只能干一件事情,一般我們說並行或串行,都以時間段來看的而不是以時間點來看的,比如你一邊上je消遣還一邊寫代碼干活,在一定的時間范圍內,你是並行的,但如果這個時間范圍你划分得非常非常短,那么你是串行的。

5.
一個cpu可以多線程。但是一個單核的cpu任何時間點,都只能在做一個任務。
如果只是像樓主說的挖隧道這么簡單的挖,那么的確多線程沒用。
只不過很可惜,計算機不像拿鐵鍬挖隧道這么簡單。

假設每挖5分鍾,就需要清理一下挖出來的石土。有一個小車在清理它們。
工人只有一個。
單線程的做法是: 挖5分鍾。然后工人停止挖,小車清理石土的5分鍾里,工人在等待。
2個線程的做發是: 挖5分鍾,小車來清理石土。這5分鍾里,工人在另一頭挖。

也不是很恰當的比喻。不過至少能說明點問題。
小車清理石土,就相當於磁盤io等相對於cpu計算來說比較慢的操作。

cpu不會等着io的完成,而去執行另一個進程的計算任務。
這邊io完成時好象是會發出什么信號來着,忘了。計算機原理都還給老師了,慚愧啊。

如樓主所舉的例子,我來解惑。
如果一個機器人代表CUP,哪么這個機器人一天所做的事情,並不都是只挖山。
它還有許多事情要做,比如砍柴,燒水,釣魚,挖山等等等。
如果按以上划分是 4條進程, 每一個進程大概占用1/4CUP時間。

如果你的設定 在挖山這一快 多設幾次同一個任務。 比如設定到 挖山共有3條線程。

哪么 挖山的CUP占用率將達到 1/2 這就是所謂的提高了效率。

現實中的CPU 在大部分時候的 閑置狀態的。
因此 開多條線程能提高效率 不如說成是 充分利用了CPU執行時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM