Thread.sleep не работает при использовании панелей / кнопок [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

0
задан GameDroids 1 November 2014 в 11:10
поделиться

1 ответ

Короткий ответ, нет.

Swing - это однопоточная инфраструктура, это означает, что любая вещь, которая блокирует Thread Dispatching Thread, не позволит ему обновлять пользовательский интерфейс или обрабатывать любые новые события (делая UI выглядит так, будто он висел, потому что он имеет).

Конечно, вы можете использовать Thread, но Swing также не является потокобезопасным. Это означает, что ВСЕ изменения в пользовательском интерфейсе ДОЛЖНЫ быть сделаны из контекста Диспетчерского потока событий. Хотя есть способы преодолеть это, самый простой способ - просто использовать Swing Timer.

Познакомьтесь с . Как использовать Swing Timers и Параллелизм в Swing для получения дополнительной информации

Вы также должны взглянуть на Начальные потоки .

При обновлении пользовательского интерфейса может потребоваться вызовите revaldiate и repaint после того, как вы добавили новые компоненты, чтобы заставить пользовательский интерфейс обновлять, чтобы переформатировать его содержимое.

5
ответ дан MadProgrammer 25 August 2018 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: