读取ObjectInputStream的阻塞问题,在线等,急!

liudows 2005-05-22 10:40:12
我碰到的问题是这样的:要从网络上读取信息,对方发来的是序列化过后的对象,我要用ObjectInputStream来读取,但是我发现ObjectInputStream是非阻塞式的。这样我就不知道对方什么时候发过来,所以我不得不用一个for(;;)循环来读取,但是这样的话CPU占用100%。请问有什么办法可以解决这个问题?
...全文
586 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
axing941021 2005-07-27
  • 打赏
  • 举报
回复
线程要休眠的,要不100%占用CPU Thread.sleep(1000)
cwjfzu 2005-05-26
  • 打赏
  • 举报
回复
上面写错
要把有这个循环的类,写在线程里面
这样就算有死循环
主线程也不会阻塞!
cwjfzu 2005-05-26
  • 打赏
  • 举报
回复
要把有这个循环的类,写在循环!
liudows 2005-05-24
  • 打赏
  • 举报
回复
问题应该是这样的,读网络信息的语句是message = (Content)(oin.readObject());,其中readObject函数不能实现阻塞式读取,当读到流的末尾时就会抛出EOFException异常。由于我又用for(;;)来循环读取,所以CPU占用率就达到100%了。看来不能用序列化流从网络上直接读取消息。
gtlang78 2005-05-24
  • 打赏
  • 举报
回复
是不是读的时候抛异常了?

catch (ClassNotFoundException e)
{}
catch (IOException e)
{}

把e.printStackTrace();加上看看吧
cwjfzu 2005-05-24
  • 打赏
  • 举报
回复
除了监听线程之外,还可以设立处理进程
这样就不会影响主界面

楼主讲一下你的结构
liudows 2005-05-22
  • 打赏
  • 举报
回复
不如我把代码贴出来吧,大伙帮我看看。可能细节上有些问题,但是总体结构就是这样的拉:
netAdapter.java

class netAdapter
{

BufferedInputStream input = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream output = new BufferedOutputStream(socket.getOutputStream());
ObjectInputStream oin = new ObjectInputStream(input);
ObjectOutputStream oout = new ObjectOutputStream(output);

public Message receive()
{
Message message = null;
try
{
message = (Content)(oin.readObject());
}
catch(ClassNotFoundException cnfe)
{
System.out.println("class Content not Found");
throw cnfe;
}
catch(EOFException eofe)
{
System.out.println("end of stream");
throw eofe;
}
catch(IOException ioe)
{
System.out.println("I/O err in receive() - " + ioe);
throw ioe;
}
}
}

main.java

public static void main(String[] args)
{
Runnable netRunnable = new Runnable()
{
public void run()
{
Message message;
netAdapter nadapter = new netAdapter();
for(;;)
{
try{
if(nadapter != null)
{
message = null;
message = nadapter.receive();
message.handle();
}
}
catch (ClassNotFoundException e)
{}
catch (IOException e)
{}
}
}
};

Thread netThread = new Thread(client.netRunnable);
netThread.start();

.....//do something in user interface
}
liudows 2005-05-22
  • 打赏
  • 举报
回复
就是写在另一个线程里的,但是整个程序响应还是很慢,界面几乎动不了,怎么办啊
zhudonhua 2005-05-22
  • 打赏
  • 举报
回复
支持楼上,新开一个线程去监视网络流,当读到对象时通知主线程去调用读取操作
cwjfzu 2005-05-22
  • 打赏
  • 举报
回复
把那个要阻塞的操作写在线程里面,这样就不会占用主线程了

这样做叫做监听线程

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧