Re: [問題] wait() notify() 使用時機
※ 引述《darkk6 (Mr. Pan)》之銘言:
: 學期結束了版上就真的變冷清了XD
: ===
: synchronized 問題大概是我學 java 到現在每次要用
: 都要重看的部分 XD
: 基本的 Producer 與 Consumer這個我是能夠理解,要怎麼使用
: 我現在想做一個系統,直覺上好像能用 wait notify 來解決
: 我想問的是:
: 假設我現在有一個 ServerSocket 接受來自 N 個 client 的連線
: ( socket=serverSocket.accept() 的 socket assign 給一個 thread 的 class)
: 每個 Client 連入的時候,都會傳個指令給 Server
: 如果 Client 的指令是 A ,就 hold 住這個 client 的 thread
: 如果有任何一個 Client 的指令是 B ,
: 就讓所有 hold 住的 class 繼續往下跑
: 很直覺的用 wait() notify() 來做... 但試不出來
: 目前問題似乎已經不是「能不能做到」而是為什麼會卡住了XD (底下補充)
: 想請問對這部分比較熟的板大們, wait() notify() 可以這樣做嗎?
: (發現問題似乎不在這邊,而是 connect 的問題,所以 wait-notify 應該做得到吧?)
: ========== 補充 ============
: 發現似乎是根本沒接受下一個 client 連線 , 一部分的 Code :
: ServerSocket svr=new ServerSocket(port);
: Socket skt;
: System.out.println("Server Start listening, port : "+port);
: while(true){
: skt=svr.accept();
: ClientInstance client=new ClientInstance(skt);
: client.start();
: System.out.println("Server Connected : "+client);
: }
: 程式執行到 client.start() 後,確實是有跑出 Server Connected
: 不過如果我在 ClientInstance 裡面的 run() 有停頓動作(如 wait , sleep)
: 那麼下一個 連線無法連入。
: Client 端是瀏覽器 , 這個程式是想要用 Socket 模擬 httpServer.
: 必須是 Multi-Thread
: 或者有沒有推薦現成的套件呢 0.0 ? (SE 為主啦XD)
: ((還是說要做一個 http server 沒那麼簡單...
: ====
: LaPass 大提供的 demo 之前我有找到過試過
: 也是一樣在第一個進來的 client 還沒 response 之前
: 第二個 Client 進不來
如果你只是要測試..不需要找額外的 Package.
兩個觀念弄懂就好了.
1. 針對同一個 Object 作 Wait.
2. 處理 Client connection 時需要在另一個 Thread 中處理
寫個 Pesudo Code.
// Server
ServerSocket sK = new ServerSocket(xxxx);
final Object waitFlag = new Object();
Socket clientConnection = nul;
while(clientConnection = sk.accept()) {
final Socket client = clientConnection;
new Thread(new Runable() {
public void run() {
String input = readline(client.getInputStream());
if (input.equals("Stop")) {
waitFlag.wait();
} else {
waitFlag.notify();
}
}
}.start();
}
如果你還要考慮到 Thread 效能.. 得用到 Pool 機制..那還是找套件吧..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 76.104.157.183
推
07/03 23:22, , 1F
07/03 23:22, 1F
是的 我寫了個小測試..證明是 Chrome/Firefox 沒有發出新的連線需求.
方法如下: 先用 瀏覽器建立連線, 通常第二個或著第三個連線並沒有被建立..
接著用 telnet (Ex: 透過 KKMAN) 連線到 Server, Server 還是有建立新的連線.
我猜. 瀏覽器 可能有些偵錯/暫存機制...並免重複建立連線之類的.
如果你要用 Http Protocol, 還是建議你找 Apache HttpClient 之類的
來幫你處理 Http Header, 寫起來會簡潔一些.
最後, 我看了你前一篇的文章, 關於 Notify/Wait 部分.
有個建議. synchronized(this) {wait();}
綁定的對象 是 Client Handler Object 本身..
所以如果有十個 client handler object.
這十個 Thread 個別綁定在 十個 object 上.
要 Notify 就不容易了..
先建一個 Object 當作 等待的對象. 比較容易解決.
也就是我上面的例子中的 waitFlag.
※ 編輯: byend 來自: 76.104.157.183 (07/04 16:13)
討論串 (同標題文章)