JAVA用多线程反而变慢了_Java中使用多线程不能明显提高程序效率的一些原因
java中使用多線程不能明顯提高程序效率的一些原因.
使用多個線程來處理多任務(wù)的時候,效率肯定是有提高的.但是必須要慎用,否則容易出現(xiàn)問題.
1.多線程主要是為了充分利用多核cpu,大內(nèi)存這些資源.
如果你的硬件跟不上,只有一個cpu,那么多線程從并發(fā)變成了串行了,另外再加上線程上下文切換的時候,那你就得不償失了.
2.原子問題
如果多線程是同步操作一個原子數(shù)據(jù),(多個線程同步去處理一個加鎖的對象),那效率肯定不會提升,就好像1個人去做1件事和多個人排隊(duì)去做一件事效率是一樣的;
3.線程的個數(shù)對于一個應(yīng)用程序來講的話,往往會有一個臨界值。
臨界資源的訪問問題,程序中臨界區(qū)的指令一般來說越少越好,最好不要在臨界區(qū)中做一些重量級的事情,例如說數(shù)據(jù)庫,寫文件,讀文件!
4.對硬盤的讀寫有特殊的地方。
對磁盤進(jìn)行多線程處理的時候,效率會急速下降!!
因?yàn)椴煌募淖x寫,會造成磁頭的頻繁轉(zhuǎn)換,磁頭的頻繁轉(zhuǎn)換要比讀取磁盤的時間更長。
所以這種情況下,最好有個線程去讀取文件,其他的線程去處理文件數(shù)據(jù)中的業(yè)務(wù)邏輯處理.
5.操作系統(tǒng)的IO通道數(shù)量的影響
采用普通的File文件API來讀寫多文件.使用多線程的話很大程度上也不會提高效率.
因?yàn)槲募?#xff0c;網(wǎng)絡(luò)等流的讀寫都需要操作IO通道,而操作系統(tǒng)的IO通道數(shù)量是固定的。
我們假設(shè)你的電腦只有一個IO通道,如果你打開一個文件流并進(jìn)行讀寫,則占用了一個IO通道,如果你又打開一個文件流,則第二個文件流需要等待第一個文件關(guān)閉通道才能真正意義上的進(jìn)行讀寫。 所以實(shí)際上,你打開多個文件同時進(jìn)行讀寫時就是在串行單線程操作。
解決的辦法是采用 NIO: java.nio (Java 2 Platform SE v1.4.2)
NIO的意思當(dāng)然就是同時開啟N個IO通道了,如果你的機(jī)器硬件的確只支持同時打開一個通道的話,Java虛擬器會幫你做虛擬協(xié)調(diào)NIO比普通IO技術(shù)至少快30%.
具體可以查看JAVA文件NIO的文檔.
普通方式寫文件先得到FileOutputStream,然后直接設(shè)用 os.write(bytes);
而現(xiàn)在不同點(diǎn)在于先得到一個Channel再建構(gòu)一個Bytebuffer,再用兩者完成任務(wù),java虛擬機(jī)幫你完成剩下的CPU和IO任務(wù)調(diào)度.
其實(shí)這個方式也就是異步的樣子了,實(shí)際里很多前端MVC框架如JSF的實(shí)現(xiàn)primefaces,已經(jīng)封裝了,也沒法用.如果要用的話也是用Apache NIO 框架 Mina.
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的JAVA用多线程反而变慢了_Java中使用多线程不能明显提高程序效率的一些原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 创建用户 %_mysql-创
- 下一篇: 给定下面的java代码_则运行_会产生类