作者chrisos (克里斯)
看板java
标题[问题] 使用JAVA来实现相对於VB的非同步指令
时间Sun Apr 28 19:52:36 2013
先向版主及各位乡民表示歉意
早上发完文後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
1F:→ pico2k:google java asynchronous socket 04/28 20:11
2F:推 PsMonkey:我觉得重点是你的 ClientHandler 怎麽写,或着更正确地说 04/28 21:07
3F:→ PsMonkey:你只是纯粹懒得了解 Java IO、Socket 的运作机制..... 04/28 21:07
4F:→ cyclone350:这问题我大学写程式时也遇到过,最後还是没想到办法 04/28 21:38
5F:→ cyclone350:结果写类似MSN是用Thread,写game是用loop看玩家动作 04/28 21:42
6F:→ cyclone350:我也想知道解答 04/28 21:49
7F:推 chchwy:我记得Java也有non-blocking IO,不需要每个人对应一个线程 04/28 21:55
8F:推 PsMonkey:那问题应该改成 InputStream 会不会 block 吧? 04/28 21:55
9F:→ PsMonkey:只能说还好我不碰 I/O 也不碰 thread [逃] 04/28 21:55
11F:→ dou0228:Java Mina 或是 Netty 可以达到你要的 04/29 11:13