我正在从套接字(通过TCP协议)读取消息,但是我注意到CPU花费了很多时间来调用我的BufferedInputStream的方法available()。这是我的代码:
@Override
public void run()
{
Socket socket;
Scanner scanner;
BufferedInputStream buffer = null;
try
{
socket = new Socket(SERVER_HOST, SERVER_PORT);
System.out.println("Connection Completed");
InputStream inputStream = socket.getInputStream();
buffer = new BufferedInputStream(inputStream);
StringBuilder readCharacter;
while (true)
{
readCharacter = new StringBuilder();
try
{
while (buffer.available() > 0)
{
readCharacter.append((char) buffer.read());
}
}
catch (IOException e)
{
e.printStackTrace();
buffer.close();
}
String array[] = separe(new String(readCharacter));
... //parsing the message我还尝试使用int read=buffer.read()和check,而不是使用if (read!=-1)函数,但在这种情况下,我无法识别message...in my StringBuilder 'readCharacter‘的结尾。我有多条消息,一条在导致解析过程失败的other..and之后……
而不是使用available()检查,进入readCharacter我在time..and上只有一条消息解析工作……
你能帮助我理解为什么,以及如何避免CPU的消耗吗?
发布于 2011-11-21 17:17:25
此循环:
while (buffer.available() > 0)
{
readCharacter.append((char) buffer.read());
}可以替换为简单的:
readCharacter.append((char) buffer.read());而不是一遍又一遍地调用非阻塞available() (这会消耗大量的CPU),只需调用read(),它将阻塞不消耗CPU,直到有可用的东西为止。看起来这就是你想要用更少的代码和复杂性来实现的。
发布于 2011-11-21 17:19:22
available()本身并不消耗CPU。你的循环是什么:
while (buffer.available() > 0) {
readCharacter.append((char) buffer.read());
}当字节不可用时,您实际上会多次(可能是数千次)调用available()。因为streams的read()方法被阻塞了,所以根本不需要调用available()。下面的代码执行相同的操作,但不占用CPU。
String line = null;
while ((line = buffer.read()) != null) {
readCharacter.append(line);
}https://stackoverflow.com/questions/8209395
复制相似问题