Является ли пустое время l oop плохой практикой? - PullRequest
1 голос
/ 04 мая 2020

Я должен загрузить данные с сервера, максимум 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;
            }
        }
    }

}

Как вы можете видеть в приведенном выше примере, у меня есть пустой while l oop в (что будет) строке 10 для принудительного предоставления гарантии isSuccessful - это присвоение значения на основе результата DownloadFileThread перед повторной проверкой условия в while l oop.

Считается ли плохой практикой делать такие вещи? Есть ли лучший подход или правильный способ сделать это?

Хотя приведенный выше код дает действительный результат, я не совсем горжусь кодом, который у меня есть написано ...

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Да, в этом случае это плохая практика, потому что Java предлагает улучшенные механизмы для ожидания завершения потока: Thread.join(), или рассмотрите возможность использования более современных функций, таких как CompletableFuture или ExecutorService, который позволяет вам ждать завершения задачи.

Использование пустого l oop для ожидания потребует много энергии ЦП без необходимости , что может означать, что другие задачи в вашей системе будут выполняться медленнее, чем могли бы.

1 голос
/ 04 мая 2020

В вашем случае while l oop будет постоянно выполнять кражу времени процесса из других вещей, возможно, также из вашей ветки загрузки. Если вы просто хотите дождаться окончания загрузки, почему бы вам не использовать Thread.join ()? Это блокировка, означающая, что вы не сможете выполнить что-либо в своем основном потоке до тех пор, пока не будет завершен DownloadThread, но в то время как l oop делает это также и в этом случае и использует больше системных ресурсов сверху.

1 голос
/ 04 мая 2020

Не обязательно, но в этом случае это напряженное ожидание, что является плохой практикой, особенно в многопоточных программах. Он загружает процессор и в вашем случае мешает работе с DownloadFileThread.

...