使用多个 Java 线程 CPU 使用率达到 100%



我创建了一个下载类扩展线程并且它有一个随机访问文件作为字段;

在运行方法中,我使用http标头范围来下载多个下载类下载的不同部分之后,我正在使用这个 while 循环。

@Override
public void run() {
    InputStream stream = null;
    this.setPriority(Thread.MAX_PRIORITY);
    try {
        // Open connection to URL.
            connectionhttp = (HttpURLConnection) url.openConnection();
            connectionhttp.setRequestProperty("Range", "bytes=" + start
                    + "-" + end);
            // Connect to server.
            //....
            try {
                connectionhttp.connect();
            } catch (IOException e) {
                System.out.println("connection error");
            }
            //....      
            int contentlength = connectionhttp.getContentLength();
                size = contentlength;
            //....
            stream = connectionhttp.getInputStream();
        }

        while (mainthread.getstatus() == Download.Downloading) {
            if (downloaded == size) {
                break;
            }
            byte buffer[];
            if (size - downloaded >4096) {
                buffer = new byte[4096];
            } else {
                buffer = new byte[(int) (size - downloaded)];
            }
            // read from server into buffer
            int read = stream.read(buffer);
            if (read == -1) {
                break;
            }
            file.write(buffer, 0, read);
            downloaded += read;

        }

    }

现在我正在下载文件,分为 8 个部分(每个部分都有不同的范围),从而创建 8 个实例用于从服务器下载单个文件。因此,我的下载速度提高了 4 倍以上,具体取决于服务器。问题是当我下载多个文件时,该程序使CPU使用率达到100%,因此我的PC会发出很多噪音。

请向我建议一种优化程序的方法,以便我的 CPU 使用率应低于 10%。在java中,线程是否有替代的此类功能?

感谢您的回复!

我怀疑问题是您正在创建大量垃圾并最大化垃圾收集器。 尝试回收缓冲区。

byte buffer[] = new byte[4096];
while (mainthread.getstatus() == Download.Downloading && downloaded < size) {
    // read from server into buffer
    int read = stream.read(buffer, 0, Math.min(buffer.length,size-downloaded));
    if (read == -1) break;
    file.write(buffer, 0, read);
    downloaded += read;
    }
}

最新更新