Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在套接字长连接中保持较低的CPU使用率_Java_Android_Sockets - Fatal编程技术网

Java 如何在套接字长连接中保持较低的CPU使用率

Java 如何在套接字长连接中保持较低的CPU使用率,java,android,sockets,Java,Android,Sockets,对不起,我的英语太差了。 我有一个javaFx应用程序,它需要连接到许多android手机上启动的Socket服务器(超过40个)。 当连接到服务器时,我会创建一个线程来保持长连接,服务器每600毫秒向我的应用程序发送一次屏幕截图(二进制)。 javaFx应用程序不能作为服务器。 以下是代码的一部分: while (ScreenMonitorService.isConnectionAll()){ Future<Image> f = ThreadPoolUtil.getThreadPo

对不起,我的英语太差了。 我有一个javaFx应用程序,它需要连接到许多android手机上启动的Socket服务器(超过40个)。 当连接到服务器时,我会创建一个线程来保持长连接,服务器每600毫秒向我的应用程序发送一次屏幕截图(二进制)。 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;
 }
while(ScreenMonitorService.isConnectionAll()){
Future f=ThreadPoolUtil.getThreadPool().submit(new Callable()){
@凌驾
公共映像调用()引发异常{
返回readImage(inputStream、outputStream);
}
});
Image fxImage=f.get();
Platform.runLater(()->{
device.getImageView().setImage(fxImage);
});
//readImage做什么
私有同步映像readImage(InputStream InputStream,OutputStream OutputStream)引发IOException{
试一试{

Thread.sleep(700);实际上……您没有忙着等待,
睡眠
并不是您出现问题的原因

您真正应该做的是分析代码,看看它在哪里花费了大部分时间。我怀疑它实际上在以下两个调用中:

    BufferedImage image = ImageIO.read(bin);
    Image fxImage = SwingFXUtils.toFXImage(image, null);
换句话说,我怀疑大部分CPU都在转换图像。如果是这样,那么您需要找到一种方法来减少图像处理

这也有可能是一个与GC相关的问题,但分析也会为这一点提供证据



我注意到,在处理之前,您正在内存中缓冲整个文件。这可能会使速度变慢。您可以通过将
InputStream
包装在
BufferedInputStream
中,并将
BIS
传递给
ImageIO.read
来避免这种情况。但我不认为字节的双重处理是主要问题m、

转换成本约为200毫秒。抱歉,如果您分析了代码,转换成本为20毫秒…实际大部分时间都花在哪里?ReadInt()花费的时间最多(约200毫秒),即读取四次以获取数据长度。服务器每600ms发送一次数据。因此,我认为读取太快可能会降低cpu性能。200ms不是cpu使用率。它实际上是空闲时间,因为您正在等待服务器。您需要测量cpu时间,而不是经过的时间。