[問題] 使用JAVA來實現相對於VB的非同步指令
先向版主及各位鄉民表示歉意
早上發完文後HINET那邊好像出了點問題,所以一直無法上來修文
--------------------------------------------------------------
我的問題是這樣的
如果現在我用JAVA來寫一個聊天室的SERVER端
那麼在建立socket並傾聽client連接請求的部分
我會這樣寫
while(true) { //用WHILE LOOP 持續接收使用者
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("got a connection");
}
上面中我用WHILE持續的監聽CLIENT端的連線請求
當有一個CLIENT連接上來後這個等待請求的執行緒便分配給他
然後創建一個新的執行緒以等待期他CLIENT的連接請求
這樣做最主要的用處,自然是解決SERVER端一次只能服務一個CLIENT的限制
但這時又出現了一個問題
"如果CLIENT連接上來後不做任何動作呢?"
既然這是一個聊天室,當CLIENT連上來後最主要的目的當然是進行文字傳輸
但是若同時有一百個CLIENT都連上了這個SERVER,但是每個人都在等待其他人發話
這是便發生了SERVER端創建了一百個thread但卻全都沒有真的使用到的狀況
換句話說,即使使用了多執行緒,不免得還是發生了讓程式等待並浪費、占用了資源
在VB中(或是該說再.NET Framework中),微軟提供了一種方法來避免發生這種狀況
即是使用 BeginXXX、EndXXX的方式。
這種方式最主要是為了要避免一個程式在運行中最容易出現的等待過程,即I/O的操作。
相對CPU來說,IO設備的速度是十分低落的,使用這種方式,能讓程式創建較少的執行
緒來完成較多的事。
最主要的不同點在於使用此方式系統會自動管理thread,自行建構,自行消滅。
我們不需要去管理thread的生命週期(類似ThreadPool),但更好的是連thread的休眠
系統都會幫我們掌控。
簡單說當需要等待時,thread會直接凍結住不占用資源,有需要時再喚醒。
而且我們還不需要自己去判斷什麼時候該休息,什麼時候不該。
---------------------------------------------------------------------------
其實打到這裡我已經又開始迷糊了..........................
以上幾乎都是我自己思考的結果,怕還是有錯誤
為了怕更誤導各位,我還是貼上一些參考文件讓各位看一下
如果說我的理解內容真的有錯誤,請各位提醒指點一下
最後我要問的問題就是,JAVA是否有命令來達到相同的功能。
參考文件
Programmer Club 論壇中對於thread即使用非同步方法的討論
http://ppt.cc/i6Lm
對岸的文件: .NET中非同步編程:傳統的非同步編程
http://ppt.cc/TL6k
對岸的文件: .NET中非同步編程:IO完成端口與BeginRead
http://ppt.cc/Q6MO
網路上能查到相關的文件非常少(也有可能我GOOGLE的方式不對....)
因此比較多的是對岸的文件,如果有人不喜歡,深感抱歉。
--
【微小說】我意外失明,女友不離不棄。後來,她遭遇車禍,臨終前把角膜捐給了我。
護士告訴我,女友離開的時候微笑著,讓我用她的眼睛代替她去好好看她眼中的世界。
我睜著剛複明的雙眼,淚如雨下。走上街頭,一切的一切都那麼熟悉,只是所有男人的
頭頂都多了一個字,要不是“攻”,要不是“受"。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.114.237
→
04/28 20:11, , 1F
04/28 20:11, 1F
推
04/28 21:07, , 2F
04/28 21:07, 2F
→
04/28 21:07, , 3F
04/28 21:07, 3F
→
04/28 21:38, , 4F
04/28 21:38, 4F
→
04/28 21:42, , 5F
04/28 21:42, 5F
→
04/28 21:49, , 6F
04/28 21:49, 6F
推
04/28 21:55, , 7F
04/28 21:55, 7F
推
04/28 21:55, , 8F
04/28 21:55, 8F
→
04/28 21:55, , 9F
04/28 21:55, 9F
→
04/28 22:02, , 10F
04/28 22:02, 10F
→
04/29 11:13, , 11F
04/29 11:13, 11F