回覆列表
  • 1 # 使用者14895248796

    從java被髮明的第一天起,就被定義為一個多執行緒的網路程式語言。Java最大特點並不是跨平臺,而是它的多執行緒模型(那時候的C++中,並沒有我們現在看到的thread,C#還沒有出來)。因為近二十年的軟體行業的增長主要來自網路程式設計,網路程式設計最常見的模型就是client/server, 也就是所謂的C/S,這種程式設計模型在伺服器端需要同時接受客戶端的請求,也就是說要有很好的併發特性--這個特性主要依賴多執行緒來實現。而java的主戰場就是伺服器端程式設計。所以多執行緒對java是極為重要,不可或缺的一環。

    當我們希望引入協程,我們想解決什麼問題。我想不外乎下面幾點:

    節省資源,輕量,具體就是:節省記憶體,每個執行緒需要分配一段棧記憶體,以及核心裡的一些資源節省分配執行緒的開銷(建立和銷燬執行緒要各做一次syscall)節省大量執行緒切換帶來的開銷與NIO配合實現非阻塞的程式設計,提高系統的吞吐使用起來更加舒服順暢(async+await,跑起來是非同步的,但寫起來感覺上是同步的)我們分開來講下。

    先說記憶體。拿Java Web程式設計舉例子,一個tomcat上的woker執行緒池的最大執行緒數一般會配置為50~500之間(目前springboot的預設值給的200)。也就是說同一時刻可以接受的請求最多也就是這麼多。如果超過了最大值,請求直接打失敗拒絕處理。假如每個執行緒給128KB,500個執行緒放一起的記憶體佔用量大概是60+MB。如果真的有瓶頸,也許CPU,IO,頻寬,DB的CPU等會有瓶頸,但這點記憶體量的增幅對於動輒數個GB的Java執行時程序來說似乎並不是什麼大問題。

  • 中秋節和大豐收的關聯?
  • 朱由校是不是被嚴重抹黑的皇帝?