Java 空while循环被认为是不好的做法吗?

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();

我将从服务器下载数据,如果下载失败,最多尝试3次

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电源,这可能意味着您系统上的其他任务的执行速度将比其他任务慢