天天看點

如何應對面試官:什麼場景中會用到java多線程?

                      如何應對面試官:什麼場景中會用到java多線程?

作者:雲栖社群

原文:https://yq.aliyun.com/ziliao/1765

(點選文末閱讀原文即可前往) 

問:能不能簡單描述一下你在java web開發中需要用到多線程程式設計的場景?

對多線程有些了解,但是不太清楚具體的應用場景,能簡單說一下你遇到的多線程程式設計的場景嗎?

回答一:

最典型的如:

1、使用者注冊完成送大禮包/積分之類,且積分等也是另一個系統并比較耗時;且這類任務即使失敗也不是特别重要的。

2、背景線程:比如定期執行一些特殊任務,如定期更新配置檔案,任務排程(如quartz),一些監控用于定期資訊采集等。

回答二:

最典型的應用比如tomcat,tomcat内部采用的就是多線程,上百個用戶端通路同一個web應用,tomcat接入後都是把後續的處理扔給一個新的線程來處理,這個新的線程最後調用到我們的servlet程式,比如doGet或者doPost方法。

如果不采用多線程機制,上百個人同時通路一個web應用的時候,tomcat就得排隊串行處理了,那樣用戶端根本是無法忍受那種通路速度的。

還有就是需要異步處理的時候,需要使用多線程。比如task a和task b要并行處理,單個線程隻能串行處理,先做完task a然後再做task b。如果想要多個task同時執行的話,就必須為每個task配置設定一個線程,然後通過java虛拟機的線程排程,來同時執行多個任務。比如你的CPU是多核心的話,就可以讓一個CPU執行一個線程。如果隻有一個CPU的話,底層是按照分時複用的原則,各個線程按照時間片來獲得CPU資源。

回答三:

特别耗時的操作,如備份資料庫,可以開個線程執行備份,然後執行傳回,前台不斷向背景詢問線程執行狀态

問:JAVA項目中哪些場景需要用到多線程,深感迷茫,請使用過的高手指點。

答:

場景一:一個業務邏輯有很多次的循環,每次循環之間沒有影響,比如驗證1萬條url路徑是否存在,正常情況要循環1萬次,逐個去驗證每一條URL,這樣效率會很低,假設驗證一條需要1分鐘,總共就需要1萬分鐘,有點恐怖。這時可以用多線程,将1萬條URL分成50等份,開50個線程,沒個線程隻需驗證200條,這樣所有的線程執行完是遠小于1萬分鐘的。

場景二:需要知道一個任務的執行進度,比如我們常看到的進度條,實作方式可以是在任務中加入一個整型屬性變量(這樣不同方法可以共享),任務執行一定程度就給變量值加1,另外開一個線程按時間間隔不斷去通路這個變量,并回報給使用者。

總之使用多線程就是為了充分利用cpu的資源,提高程式執行效率,當你發現一個業務邏輯執行效率特别低,耗時特别長,就可以考慮使用多線程。不過CPU執行哪個線程的時間和順序是不确定的,即使設定了線程的優先級,是以使用多線程的風險也是比較大的,會出現很多預料不到的問題,一定要多熟悉概念,多構造不同的場景去測試才能夠掌握!

繼續閱讀