2013-12-10 83 views
31

我使用java(Servlets,JSP)2年來開發Web應用程序。在這兩年中,我從來沒有要求在任何項目中明確使用multithreading(因爲我知道servlet容器使用線程爲相同的servlet提供不同的請求)。多線程在web應用程序中的作用

但是每當我參加面向Web開發人員職位(java)的面試時,就會有幾個與java中的線程相關的問題。我知道java線程的基礎知識,所以回答問題不是問題。但是有時我會因爲不使用mutithreading而在開發Web應用程序時錯過某些東西而感到困惑?

所以我的問題是multithreading在Web應用程序中的作用是什麼?任何例子multithreading可以用於Web應用程序將不勝感激。

在此先感謝。

+2

恕我直言,你絕對正確的認爲,多線程在web應用中的主要作用是同時處理多個獨立的請求,從而使服務器響應。 – Ingo

+4

舉個例子說,你有一個用戶註冊頁面,你需要發送該用戶關於註冊的電子郵件通知。在這種情況下,我們可以通過在單獨線程中發送電子郵件來使用多線程。 – Foolish

+1

我正在使用多線程來解析xmls –

回答

40

多線程可用於Web應用程序,主要是當您對異步調用感興趣時。

例如,您可以考慮一個Web應用程序,它激活GSM網絡上的用戶狀態(例如激活4G計劃),並在最後發送確認短信或電子郵件消息。

瞭解Web通話需要幾分鐘的時間 - 尤其是在GSM網絡受到壓力時 - 從Web線程直接調用它是沒有意義的。

因此,基本上,當用戶點擊「激活」,則服務器將返回類似「感謝啓動4G計劃。你的計劃將在幾分鐘內被激活,您將收到一條確認短信/郵件」。

在這種情況下,您的服務器必須以異步方式產生一個新線程,理想情況下使用線程池,並立即向用戶返回響應。

工作流程:

1-用戶點擊「激活」按鈕
2- servlet接收請求並激活一個線程池的新「激活4G計劃」的任務。
3- Servlet立即向用戶返回HTML響應,而不用等待任務完成。
4- Http交易結束
。 。 。

異步,4G的計劃後來被激活,用戶會獲得通過短信或電子郵件等通知......

5

談到一個現實世界的例子,有幾個理由使用多線程,和我不會聘請不瞭解它的網絡開發人員。但最終,使用多線程的原因與標準和網絡開發相同:您要麼需要在後臺完成一段時間(也就是阻止),以便在用戶之間給予用戶某種響應,要麼您有一項任務可以通過在多個內核上運行來加速。當多線程實際上有用時,卻是一個不同的問題。

情況1:即確實需要一些處理並且具有低的命中Web服務器/第二

這裏多線程(如果適用於算法)是好事,因爲空閒內核被利用和線程可以導致對用戶的更快響應。

情況2:那確實需要一些處理,具有較高的命中Web服務器/秒

這裏多線程是可能的,但核心是平時忙於其他請求,不存在資源留下來正確使用它。事實上,將任務分散到多個線程中甚至可能對響應時間產生負面影響,因爲任務現在已經碎片化並且所有部分都需要完成,但線程的執行順序未定義。因此,一個客戶端可以立即收到響應,而其他客戶可能會等待超時,直到最後一個分段最終得到處理。

情況3: Web服務器必須做一些處理,需要一個很長的時間,需要

這裏多線程,有沒有辦法解決它。客戶不能等待幾分鐘或者幾個小時,直到收到響應。在這種情況下,通常會執行回調系統,因此基本上每個任務都有一個可以查詢當前狀態的「API」。大多數網上商店都是這樣的例子:您訂購了一些東西,稍後您可以查詢您的訂單狀態。

線程的替代方法是過程分支,就像Apache在其標準配置中那樣。好處是負載分佈在覈心之間(主要適用於情況2),並且Web代碼本身不必爲使用所有核心而做任何事情,因爲OS會自動處理這些核心。但是,如果負載不平衡,則某些內核可能處於空閒狀態,並且不會以最佳方式使用資源。線程情況幾乎總是更好的解決方案,如果它是正確的話。但是Apache/Tomcat標準配置使用非常過時的線程模型,爲每個請求產生一個線程。有效地給予一定的點擊次數/秒,CPU比線程更忙於實際處理這些請求。

+0

是不是情況3 JMS,消息隊列等的用例?什麼使用這個,多線程或消息隊列? – onlinenaman

+0

通常是兩者的組合。多線程允許利用所有可用的資源,以及諸如消息隊列等技術來確保以100%的效率使用它們。 – TwoThe

3

這是一個很好的問題,我認爲大多數在Web應用程序開發中工作的開發人員並不明確使用多線程。 原因很明顯,因爲您使用的是應用程序服務器來部署應用程序,因此應用程序服務器在內部爲傳入請求管理線程池。

那麼爲什麼要明確使用多線程呢?什麼是需要一個Web應用程序開發人員暴露自己多線程?

當您在大規模應用程序中工作時,您必須同時處理多個請求,因爲特定類型的請求可能會進行大量處理,從而降低應用程序的性能,所以很難同時處理各種請求。

讓我們舉一個例子,其中一個Web應用程序在提供特定類型的請求後必須通過電子郵件和SMS通知用戶。與請求線程同步執行可能會降低Web應用程序的性能。 因此,多線程的作用就來了。 在這種情況下,建議通過僅負責發送電子郵件和短信的網絡開發一個獨立的多線程應用程序。

0

當您對並行操作感興趣時(例如從多個地址獲取數據),可以使用Web應用程序中的多重循環。

據我所知,多線程用於線程池的不同情況,可用於處理來自多個客戶端的請求。