W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
本節(jié)將簡單介紹一般的線程模型,Netty 中如何使用指定的線程模型,以及 Netty 過去不同的版本中使用的線程模型。你會更好的理解不同的線程模型的所有利弊。
一個線程模型指定代碼執(zhí)行,給開發(fā)人員如何執(zhí)行他們代碼的信息。這很重要,因為它允許開發(fā)人員事先知道如何保護他們的代碼免受并發(fā)執(zhí)行的副作用。若沒有這個知識背景,即使是最好的開發(fā)人員都只能是碰運氣,希望到最后都能這么幸運,但這幾乎是不可能的。進入更多的細節(jié)之前,提供一個更好的理解主題的回顧這些天大多數應用程序做什么。
大多數現代應用程序使用多個線程調度工作,因此讓應用程序使用所有可用的系統(tǒng)資源以有效的方式。這使得很多有意義,因為大部分硬件有不止一個甚至多個CPU核心。如果一切都只有一個 Thread 執(zhí)行,不可能完全使用所提供的資源。為了解決這個問題,許多應用程序執(zhí)行多個 Thread 的運行代碼。在早期的 Java,這樣做是通過簡單地按需創(chuàng)建新 Thread 時,并發(fā)工作需要做。
但很快就發(fā)現,這不是完美的,因為創(chuàng)建 Thread 和回收會給他們帶來的開銷。在 Java 5 中,我們終于有了所謂的線程池,經常緩存 Thread,用來消除創(chuàng)建和回收 Thread 的開銷。這些池由 Executor 接口提供。Java 5 提供了許多有用的實現,在其內部發(fā)生顯著的變化,但思想都一脈相承的。創(chuàng)建 Thread 和重用他們提交一個任務時執(zhí)行。這可以幫助創(chuàng)建和回收線程的開銷降到最低。
下圖顯示使用一個線程池執(zhí)行一個任務,提交一個任務后會使用線程池中空閑的線程來執(zhí)行,完成任務后釋放線程并將線程重新放回線程池:
Figure 15.1 Executor execution logic
這個修復 Thread 創(chuàng)建和回收的開銷,不需要每個新任務創(chuàng)建和銷毀新的 Thread 。
但使用多個 Thread 提供了資源和管理成本,作為一個副作用,引入了太多的上下文切換。這種會隨著運行的線程的數量和任務執(zhí)行的數量的增加而惡化。盡管使用多個線程在開始時似乎不是一個問題,但一旦你把真正工作負載放在系統(tǒng)上,可以會遭受到重擊。
除了這些技術的限制和問題,其他問題可能發(fā)生在相關的維護應用程序 / 框架在未來或在項目的生命周期里。有效地說,增加應用程序的復雜性取決于對比。當狀態(tài)簡單時,寫一個多線程應用程序是一個辛苦的工作!你能解決這個問題嗎?在實際的場景中需要多個 Thread 規(guī)模,這是一個事實。讓我們看看 Netty 是解決這個問題。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: