我创建了一个下载类扩展线程并且它有一个随机访问文件作为字段;
在运行方法中,我使用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;
}
}