Java 空while循环被认为是不好的做法吗?
我将从服务器下载数据,如果下载失败,最多尝试3次Java 空while循环被认为是不好的做法吗?,java,thread-safety,Java,Thread Safety,我将从服务器下载数据,如果下载失败,最多尝试3次 public class DownloadFile { private boolean isSuccessful; public DownloadFile() { int attempt = 0; while(!isSuccessful && (attempt++ < 3)) { DownloadFileThread.start();
public class DownloadFile {
private boolean isSuccessful;
public DownloadFile() {
int attempt = 0;
while(!isSuccessful && (attempt++ < 3)) {
DownloadFileThread.start();
while (DownloadFileThread.isAlive());
}
}
private Thread DownloadFileThread = new Thread() {
public void run() {
try {
// download file from server
isSuccessful = true;
} catch (Exception e) {
isSuccessful = false;
}
}
}
}
公共类下载文件{
私有布尔值成功;
公共下载文件(){
int尝试=0;
而(!isSuccessful&&(尝试+++<3)){
下载FileThread.start();
while(DownloadFileThread.isAlive());
}
}
私有线程下载FileThread=新线程(){
公开募捐{
试一试{
//从服务器下载文件
isSuccessful=真;
}捕获(例外e){
isSuccessful=错误;
}
}
}
}
正如您在上面的示例中所看到的,我在第10行中有一个空的while
循环,以强制保证isSuccessful
是一个基于DownloadFileThread
结果的赋值,然后再次检查while
循环中的条件
做这样的事被认为是坏习惯吗?有没有更好的方法或正确的方法来做到这一点
虽然上面的代码确实产生了一个有效的结果,但我并不完全为我所写的代码感到自豪…不一定,但在这种情况下,这是一个繁忙的等待,这是一种糟糕的做法,尤其是在多线程程序中。它使CPU保持忙碌,并且在您的情况下会干扰下载FileThread 不一定,但在这种情况下,这是一种繁忙的等待,这是一种不好的做法,尤其是在多线程程序中。它使CPU保持忙碌,并且在您的情况下会干扰下载FileThread 在您的情况下,while循环将永久性地执行,从其他东西(可能也从您的下载线程)窃取处理时间。 如果您只是想等待下载完成,为什么不使用Thread.join()?
它是阻塞的,这意味着在下载线程完成之前,您将无法在主线程中执行任何操作,但在这种情况下,您的while循环也会执行此操作,并在顶部使用更多的系统资源。在您的情况下,while循环将永久性地执行,从其他事情(可能也从您的下载线程)窃取处理时间。 如果您只是想等待下载完成,为什么不使用Thread.join()?
它是阻塞,这意味着在下载线程完成之前,您将无法在主线程中执行任何操作,但在这种情况下,您的while循环也会执行此操作,并在上面使用更多的系统资源。是的,在这种情况下,这是一种不好的做法,因为Java提供了更好的机制来等待线程完成:,或者考虑使用更多的现代特性,比如允许你等待任务完成的。
使用空循环等待将不必要地消耗大量CPU电量,这可能意味着您系统上的其他任务将比其他任务执行得慢。是的,在这种情况下,这是一种不好的做法,因为Java提供了更好的机制来等待线程完成:,或者考虑使用更多的现代特性,比如允许你等待任务完成的。 使用空循环等待将不必要地消耗大量CPU电源,这可能意味着您系统上的其他任务的执行速度将比其他任务慢