我创建了一个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这种功能的替代方案?
感谢您的回复!
答案 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;
}
}