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