如何在Socket long连接中保持低CPU使用率

时间:2016-12-30 02:21:43

标签: java android sockets

对不起我的泳池英语。 我有一个javaFx应用程序需要连接到许多Socket服务器(超过40个),这些服务器在Android手机中启动。 当连接到服务器时,我创建一个线程来保持长连接,服务器每隔600ms就将SCREENSHOT(二进制)发送到我的应用程序。 javaFx应用程序不能是服务器。 以下是代码的一部分:

while (ScreenMonitorService.isConnectionAll()){
Future<Image> f = ThreadPoolUtil.getThreadPool().submit(new Callable<Image>() {
  @Override
  public Image call() throws Exception {
       return readImage(inputStream, outputStream);
    }
  });
Image fxImage = f.get();
Platform.runLater(()->{
    device.getImageView().setImage(fxImage);
});


//what readImage do
private synchronized Image readImage(InputStream inputStream, OutputStream outputStream) throws IOException {
try {
        Thread.sleep(700);<==== This is the now solution for high cpu performtion , but it doesn't work
    } catch (InterruptedException e) {
        logger.error("=====> error", e);
    }
    int fileLen = readInt(inputStream);
    int readLength = fileLen;
    int tempLength = 0;
    int n;
    byte[] bt = new byte[readLength];
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    while ((n = inputStream.read(bt,0,readLength)) > 0) {
        tempLength += n;
        readLength = tempLength + n > fileLen ? fileLen - tempLength : readLength;
        bout.write(bt,0,n);
    }
    ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
    BufferedImage image = ImageIO.read(bin);
    Image fxImage = SwingFXUtils.toFXImage(image,null);
    writeInt(outputStream,1);
    return fxImage;
 }

我知道这是繁忙的工作,导致糟糕的CPU性能。 我使用了nio | notify / wait | blockqueue来尝试解决问题,但都失败了。 可能有人可以给我一些建议来解决这个问题,谢谢。

1 个答案:

答案 0 :(得分:1)

实际上......你没有忙着等待,而sleep并不是你问题的原因。

您真正应该做的是配置代码,以查看它在大部分时间内花费的时间。我怀疑它实际上是在这两个电话中:

    BufferedImage image = ImageIO.read(bin);
    Image fxImage = SwingFXUtils.toFXImage(image, null);

换句话说,我怀疑大部分CPU都在转换图像。如果是这种情况,那么你需要找到一种方法来减少图像处理。

这也可能是与GC相关的问题,但分析也会为此提供证据。

我注意到你在处理它之前在内存中缓冲整个文件。这可能会让事情变得更慢。您可以通过将InputStream包裹在BufferedInputStream中并将BIS传递给ImageIO.read来避免这种情况。但我不认为对字节的双重处理是主要问题。