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執行時間。

?

轉載于:https://www.cnblogs.com/shann/p/6851889.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372197.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 8:測試Lambda水

Java 8大約有一年的時間了,它具有我非常期待的語言功能: Lambda Expression 。 令人遺憾的是,另一個重要功能Java平臺模塊已延遲到Java9。但是,將lambda表達式(或閉包)添加到該語言中將使Java編程變得更好。…

java定義js函數_JS中可以先使用函數,然后再定義.

首先要說明的,下面這種方式是對的,雖然不知道為什么,很奇怪為什么可以先使用,再定義,希望有了解的人可以給個說法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首發于 http://blog.openj.cn下面的這種定義函數方式,對于寫一些比較復雜的代碼…

基于閥值的工作流引擎設計

最近在做工作流處理流程部分的工作,順便研究了一下工作流引擎的一些設計理念和原理。由于以前接觸過人工智能神經網絡的一些東西,發現工作流引擎和神經網絡還是頗有一些相似之處,都是滿足一定的條件下向下一個節點傳遞。在神經網絡的神經元中…

Git之安裝管理

1.Git安裝部署 Git是分布式的版本控制系統,我們只要有了一個原始Git版本倉庫,就可以讓其他主機克隆走這個原始版本倉庫,從而使得一個Git版本倉庫可以被同時分布到不同的主機之上,并且每臺主機的版本庫都是一樣的,沒有主…

Java執行程序服務類型

ExecutorService功能是Java 5附帶的。它擴展了Executor接口,并提供了線程池功能來執行異步簡短任務。 使用Java 6提供的ExecutorService接口有五種異步執行任務的方法。 ExecutorService execService Executors.newCachedThreadPool(); 這…

MySQL的主動優化和被動優化_MySQL“被動”性能優化匯總!

年少不知優化苦,遇坑方知優化難。 ——村口王大爺本文內容導圖如下:我之前有很多文章都在講性能優化的問題,比如下面這些:當然,本篇也是關于性能優化的,那性能優化就應該一把梭子嗎?還是要符合一…

python2

一、管理庫的安裝 安裝pip 提示報錯:安裝pip提示No module named setuptools Windows環境下Python默認是沒有安裝setuptools這個模塊的,這也是一個第三方模塊。下載地址為http://pypi.python.org/pypi/setuptools。下載后直接運行ez_setup.py 參考地址&…

Java Mybatis

Mybatis轉載于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看錯誤消息java.lang.NoSuchMethodError,您可能會理解Java虛擬機正在嘗試向我們表明您調用的方法在類或接口中不可用。 您還可能在執行沒有公共static void main()方法的類時拋出此錯誤。要了解其背后的原因,請閱讀本文。 …

【圖】最短路徑——Floyed算法和Dijkstra算法

最短路徑問題(floyed.cpp dijkstra.cpp) 題目描述平面上有n個點(n<100)&#xff0c;每個點的坐標均在-10000&#xff5e;10000之間。其中的一些點之間有連線。若有連線&#xff0c;則表示可從一個點到達另一個點&#xff0c;即兩點間有通路&#xff0c;通路的距離為兩點間的…

java的empty_Java Stack empty()方法與示例

堆棧類empty()方法empty()方法在java.util包中可用。empty()方法用于檢查此堆棧是否為空。empty()方法是一個非靜態方法&#xff0c;只能通過類對象訪問&#xff0c;如果嘗試使用類名稱訪問該方法&#xff0c;則會收到錯誤消息。在檢查空狀態時&#xff0c;empty()方法不會引發…

Java并發– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并發實用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier與CountDownLatch類似&#xff0c;我們在上…

java i o總結_Java I/O 總結

一、IO流的三種分類方式1.按流的方向分為&#xff1a;輸入流和輸出流2.按流的數據單位不同分為&#xff1a;字節流和字符流3.按流的功能不同分為&#xff1a;節點流和處理流二、IO流的四大抽象類&#xff1a;字符流&#xff1a;Reader Writer字節流&#xff1a;InputStream(讀數…

try...catch 語句

一般情況下&#xff0c;我們很少用到 try...catch 語句&#xff0c;但是有時候為了測試代碼中的錯誤&#xff0c;也有可能會用到。小白我也在工作中用到過。那么好的程序設計&#xff0c;什么時候會用到呢&#xff1f; try...catch 一般用來捕獲宿主對象或者ECMAScript拋出的異…

用Mockito回答

在編寫單元測試時 &#xff0c;必須牢記不要依賴外部組件。 為了避免這種情況&#xff0c;我們使用了模擬框架&#xff0c;對我來說&#xff0c;最容易使用的是Mockito 。 在本文中&#xff0c;我們將看到在Mockito中使用的一種“高級”技術&#xff0c;可以使用Answer接口在模…

java三板斧_Java 枚舉使用三板斧

Java 枚舉使用三板斧1 定義public enum CountryEnums {ONE(1,"韓"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"趙"),SIX(6,"齊");private Integer retCode;private String retMsg;// 枚舉的構造方法是 pri…

假裝這些是MyEclipse的快捷鍵(1)

Java快捷鍵 Alt / 代碼自動補全Alt Shift S 功能菜單 Ctrl 1 代碼自動修正Ctrl / 單行注釋/取消Ctrl O 查看類的所有方法Ctrl T 查看類的集成架構圖Ctrl Shift / 多行注釋Ctrl Shift \ 取消多行注釋Ctrl Shift F 代碼格式化轉載于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–簡單列表報告

這是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我將專注于一個簡單的需求&#xff0c;并且我將進一步深入。 起點是我們已經為圖書商店完成的項目設置&#xff0c;我將向其中添加一個列表&#xff0c;其中包含在數據庫中注冊的其他圖書&#xff0c;該列表也將…

2016.10.17先占坑

2016.10.17先占坑轉載于:https://www.cnblogs.com/amurzet/p/5978986.html

ER圖流程圖

ER圖&#xff1a;ER圖分為實體、屬性、關系三個核心部分。實體是長方形體現&#xff0c;而屬性則是橢圓形&#xff0c;關系為菱形。 圖書館管理系統流程圖&#xff08;圖片源于網上&#xff09;&#xff1a;對于程序員來說&#xff0c;我們要知道&#xff1a;整個系統中&#x…