成都心情
BlogJava
::
首頁
:: ::
聯系
::
聚合
::
管理
::
98 隨筆 :: 2 文章 :: 501 評論 :: 1 Trackbacks
公告
本作品采用
知識共享署名-相同方式共享 2.5 中國大陸許可協議
進行許可。
(15)
給我留言
查看公開留言
查看私人留言
隨筆分類
(91)
Java EE 服務器端(13)
(rss)
Java EE 表現層及容器(12)
(rss)
Java ME(1)
(rss)
Java 基礎(10)
(rss)
MatLab(1)
(rss)
O/R Mapping(13)
(rss)
Versant db4o 中文項目(12)
(rss)
Web前端技術
(rss)
五花八門(8)
(rss)
大數據(3)
(rss)
工作流(10)
(rss)
數據庫(2)
(rss)
模式與策略(6)
(rss)
隨筆檔案
(99)
2016年7月 (2)
2016年6月 (4)
2016年5月 (3)
2016年4月 (2)
2010年7月 (1)
2010年6月 (2)
2010年5月 (3)
2010年3月 (1)
2010年1月 (1)
2009年10月 (1)
2009年9月 (1)
2009年7月 (1)
2009年6月 (1)
2009年3月 (1)
2009年2月 (1)
2008年12月 (2)
2008年9月 (1)
2008年8月 (1)
2008年7月 (1)
2008年6月 (1)
2008年4月 (1)
2008年3月 (1)
2008年1月 (1)
2007年12月 (2)
2007年10月 (1)
2007年9月 (1)
2007年8月 (1)
2007年6月 (2)
2007年5月 (1)
2007年4月 (1)
2007年2月 (1)
2007年1月 (1)
2006年12月 (1)
2006年11月 (1)
2006年10月 (1)
2006年9月 (1)
2006年8月 (1)
2006年7月 (1)
2006年6月 (1)
2006年5月 (1)
2006年4月 (1)
2006年3月 (1)
2006年2月 (1)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (1)
2005年9月 (2)
2005年8月 (37)
文章分類
(2)
我的收藏(2)
(rss)
友情鏈接
david.turing
(rss)
wyingquan的專欄
(rss)
信息安全思想
俺的豬窩~!@
喜馬拉雅的雪杉
(rss)
無聊人士
(rss)
竹十一
(rss)
老劉忙不忙
(rss)
邢紅瑞的blog
(rss)
積分與排名
積分 - 635655
排名 - 74
最新評論
1.?re: 精確截取字符串(轉載)
string=goodStr(string); 這個方法 是干什么用處的?
--JustPassoner
2.?re: 精確截取字符串(轉載)
@國家機器
六六,認識你是我等榮幸,酒瘋知己千杯燒...
--JustPassoner
3.?re: 使用Memory Analyzer tool(MAT)分析內存泄漏(二)[未登錄]
樓主可以去看看一篇jvm的連載 公眾號 ITmenghuo
--dddd
4.?re: 使用Memory Analyzer tool(MAT)分析內存泄漏(一)
小瑕疵。
圖片顯示不了。
--袁良錠
5.?re: Hadoop周刊—第 169 期
喲,又開始更新了
--救救劉書記
閱讀排行榜
1.?使用Memory Analyzer tool(MAT)分析內存泄漏(二)(121270)
2.?使用Memory Analyzer tool(MAT)分析內存泄漏(一)(75980)
3.?Java 中的位運算(31049)
4.?Ajax輪詢以及Comet模式—寫在Servlet 3.0發布之前(15655)
5.?RBAC 模型初探(13709)
評論排行榜
1.?德國申根商務簽證攻略(成都版)(36)
2.?OSWorkflow 探索(29)
3.?北漂找工作經歷(26)
4.?使用Memory Analyzer tool(MAT)分析內存泄漏(一)(23)
5.?開源面向對象數據庫 db4o 之旅: 初識 db4o“db4o 之旅(一)”(21)
Servlet的異步轉同步調用
PS:寫作本文僅僅為了了卻一樁心愿,只是一種嘗試,基本上無實際應用價值。
早在N年多前,給別人做一web應用,期間要使用jsp調客戶提供的Socket客戶端,去獲取遠端數據。由于該客戶端是異步處理,所以jsp發出請求后到底何時能獲得數據,是個問題。遂想了個辦法,既jsp固定sleep一個足夠長的時間,然后Socket客戶端把數據寫到某靜態變量中,等jsp的sleep超時,jsp再去那個靜態區去抓。這種做法倒是能用,只是時好時壞,特別是網絡環境差的時候,容易得到null的數據。當然,最后改成了循環sleep,直到把數據刷出來為止。
問題是解決了,但冒出一個念頭,想把訪問異步環境的過程轉換為同步,既對Servlet進行wait,然后待異步返回后再notify它。說干就干,Servlet代碼如下,以Tomcat 5.5為例。
import
java.io.IOException;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
public
class
Rec
extends
HttpServlet {
private
static
final
long
serialVersionUID
=
1L
;
public
String var;
public
Rec() {
super
();
}
protected
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
doPost(request, response);
}
protected
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
String tName
=
Thread.currentThread().getName();
GoProcess p
=
new
GoProcess(
this
, tName);
p.setName(
"
GoPro
"
);
p.start();
synchronized
(
this
){
try
{
System.out.println(
"
servlet
"
+
tName
+
"
開始等待
"
);
this
.wait();
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
response.getWriter().write(var);
}
}
Tomcat 5.5默認啟動25個守護線程,來響應瀏覽器請求。所以,當每個請求來了之后,Tomcat都會找個可用線程來響應(根據測試,在多標簽瀏覽器中,多次打開相同Servlet,Tomcat只會由同一線程響應),我們可以得到該線程的名字,例如“http-8080-Processor25”。來看上面的代碼,比較簡單,把Servlet實例傳遞給異步處理線程,然后處理線程啟動,Servlet線程自己wait。
import
java.util.Date;
public
class
GoProcess
extends
Thread {
private
Rec _rec;
private
String _tName;
public
GoProcess(Rec rec, String tName){
_rec
=
rec;
_tName
=
tName;
}
public
void
run(){
try
{
long
lptime
=
Math.round(Math.random()
*
100000
);
System.out.println(
"
servlet
"
+
_tName
+
"
進入GoPro線程,開始干活。需要
"
+
lptime
+
"
毫秒
"
);
Thread.sleep(lptime);
System.out.println(
"
處理結束呼喚servlet
"
+
_tName);
synchronized
(_rec){
_rec.notify();
_rec.var
=
new
Date().toString()
+
"
done!
"
;
}
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
處理線程模擬不同的網絡環境進行sleep,可以把sleep之上的代碼看成進入異步調用,之后的代碼看成異步返回。打開一個firefox和兩個ie6窗口,調試結果如下。
servlet http-
8080
-Processor24 開始等待
servlet http-
8080
-Processor24 進入GoPro線程,開始干活。需要49277毫秒
servlet http-
8080
-Processor25 開始等待
servlet http-
8080
-Processor25 進入GoPro線程,開始干活。需要7610毫秒
servlet http-
8080
-Processor23 開始等待
servlet http-
8080
-Processor23 進入GoPro線程,開始干活。需要20599毫秒
處理結束呼喚servlet http-
8080
-Processor25
處理結束呼喚servlet http-
8080
-Processor23
處理結束呼喚servlet http-
8080
-Processor24
看起來是能實現異步調用轉換為同步阻塞調用的方式。不過就像我在最前面說的,毫無意義!因為一旦網絡環境很差,有可能會導致瀏覽器長時間處于空白加載狀態,非常糟糕的用戶體驗(BTW:沒有實驗過nio的連接器,猜想這樣阻塞訪問會嚴重影響nio的性能)。所以,在真正遇到怎樣的問題時還不如用ajax的方式處理,在頁面上開辟一小塊信息區顯示狀態,然后ajax輪詢服務器端異步返回的結果,一旦返回就立刻體現到頁面上。好了,歡迎拍磚。
請注意!引用、轉貼本文應注明原作者:Rosen Jiang 以及出處:
http://m.tkk7.com/rosen
posted on 2010-05-09 13:34
Rosen
閱讀(5913)
評論(2)
編輯
收藏
所屬分類:
Java EE 服務器端
評論
#
re: Servlet的異步轉同步調用[未登錄]
2010-05-09 23:49
Long
既然需要等待處理結果,為什么還要起一個線程來執行任務,直接在當前線程里執行不就行了??
回復
更多評論
#
re: Servlet的異步轉同步調用
2010-05-10 08:41
Rosen
@Long
這只是一個測試例子,在當前線程當然能實現一樣的效果。
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Servlet的異步轉同步調用
利用 iText 實現 PDF 報表下載
OSGi起步(OSGi for Beginners)
Java 生成 JPG 縮略圖
Apache FileUpload 上傳以及 JExcelApi 解析
JBI-Java 實現 SOA 的標準途徑(翻譯)
與 Axis 1.x 同行
BIRT 總覽(翻譯)
XML 的 RUD
四種 XML 解析技術之不完全測試
Powered by:
BlogJava
Copyright © Rosen
主站蜘蛛池模板:
99在线观看视频免费
|
精品久久久久久久免费人妻
|
亚洲区视频在线观看
|
永久免费看bbb
|
免费精品久久天干天干
|
精品亚洲国产成人
|
日韩精品电影一区亚洲
|
国产99视频精品免费专区
|
亚洲AV成人影视在线观看
|
羞羞网站在线免费观看
|
午夜亚洲AV日韩AV无码大全
|
18禁成年无码免费网站无遮挡
|
成年免费a级毛片
|
亚洲国产情侣一区二区三区
|
久久激情亚洲精品无码?V
|
成人免费看片又大又黄
|
高清免费久久午夜精品
|
中文字幕日本人妻久久久免费
|
亚洲色欲色欲www
|
亚洲自偷自偷图片
|
四虎在线视频免费观看
|
一级毛片免费播放
|
人碰人碰人成人免费视频
|
亚洲伊人久久大香线蕉结合
|
国产亚洲免费的视频看
|
免费无码黄网站在线观看
|
一级毛片免费播放
|
两性色午夜免费视频
|
精品在线免费视频
|
精品亚洲成在人线AV无码
|
亚洲一二成人精品区
|
国产亚洲美日韩AV中文字幕无码成人
|
免费无码AV片在线观看软件
|
免费成人在线视频观看
|
一级毛片a免费播放王色电影
|
四虎免费久久影院
|
曰曰鲁夜夜免费播放视频
|
农村寡妇一级毛片免费看视频
|
亚洲中字慕日产2021
|
亚洲av无码一区二区三区网站
|
国产在线观看免费不卡
|