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

时间:2014-12-09 18:37:35

标签: java multithreading cpu-usage

我创建了一个Download Class扩展线程 它有一个randomaccessfile作为字段;

在run方法中,我使用http Header-Range来为多个Download Class下载不同的部分 之后我正在使用这个循环。

@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%,因此我的电脑会产生很多噪音。

请建议我优化程序的方法,以便我的cpu使用率低于10%。 在Java中有没有Threads这种功能的替代方案?

感谢您的回复!

1 个答案:

答案 0 :(得分:1)

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

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;
    }
}