[問題] 使用JAVA來實現相對於VB的非同步指令

看板java作者 (克里斯)時間12年前 (2013/04/28 19:52), 編輯推噓3(308)
留言11則, 6人參與, 最新討論串1/1
先向版主及各位鄉民表示歉意 早上發完文後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
google java asynchronous socket
04/28 20:11, 1F

04/28 21:07, , 2F
我覺得重點是你的 ClientHandler 怎麼寫,或著更正確地說
04/28 21:07, 2F

04/28 21:07, , 3F
你只是純粹懶得了解 Java IO、Socket 的運作機制.....
04/28 21:07, 3F

04/28 21:38, , 4F
這問題我大學寫程式時也遇到過,最後還是沒想到辦法
04/28 21:38, 4F

04/28 21:42, , 5F
結果寫類似MSN是用Thread,寫game是用loop看玩家動作
04/28 21:42, 5F

04/28 21:49, , 6F
我也想知道解答
04/28 21:49, 6F

04/28 21:55, , 7F
我記得Java也有non-blocking IO,不需要每個人對應一個線程
04/28 21:55, 7F

04/28 21:55, , 8F
那問題應該改成 InputStream 會不會 block 吧?
04/28 21:55, 8F

04/28 21:55, , 9F
只能說還好我不碰 I/O 也不碰 thread [逃]
04/28 21:55, 9F

04/28 22:02, , 10F
04/28 22:02, 10F

04/29 11:13, , 11F
Java Mina 或是 Netty 可以達到你要的
04/29 11:13, 11F
文章代碼(AID): #1HVGsHHZ (java)