作者byend (漫步)
看板java
标题Re: [问题] wait() notify() 使用时机
时间Tue Jul 3 15:01:27 2012
※ 引述《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
1F:推 darkk6:恩恩,这个问题我已经确定应该是浏览器的问题了~ 谢罗~ 07/03 23:22
是的 我写了个小测试..证明是 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)