Вопрос

Я использую следующий подход к спинком:

while(!hasPerformedAction()){
    //wait for the user to perform the action
    //can add timer here too
}

setHasPerformedAction(false);

return getActionPerfomed();

Это в основном ожидает пользователя выполнять действие, а затем возвращает его. В настоящее время что-то запрашивает ответ от пользователя перед продолжением, вот почему я жду, пока ввод не получен. Однако мне было интересно, является ли это неэффективным, и если мы ждем некоторое время (т. Е. <= 30 секунд), это замедлит компьютер, который работает в этом приложении. Есть ли другие альтернативы, используя этот подход, т.е. замки, семафоры, если так, каковы синтаксис?

Спасибо,

Aly.

Это было полезно?

Решение

На самом деле это не только это неэффективно, даже не гарантированно работать, поскольку нет «случаев - прежде чем» край в коде, который вы показываете. Создать а бывает - до края Вам нужно сделать один из:

  1. Доступ к летучей переменной
  2. Синхронизировать на общий ресурс
  3. Используйте параллельные Utils Lock.

Как упоминалось в другом комментарии, проще всего Решение, просто чтобы убедиться, что ваш флаг является летучей переменной, а просто бросить короткий сон в вашу петлю.

Тем не менее, лучшее, что нужно сделать, можно было бы синхронизировать / ждать / уведомить в общей переменной.

Методы, которые вам нужно для чтения на ждать а также уведомлять. Отказ Для лучшего описания о том, как использовать их, прочитайте эта статья. Отказ Пример фрагмента кода показан ниже;

Нить 1.

Object shared = new Object();
startThread2(shared);
synchronized (shared) {
  while (taskNotDone())
    shared.wait();
}

Тема 2.

// shared was saved at the start of the thread
// do some stuff
markTaskAsDone();
synchronized (shared) {
  shared.notify();
}

Другие советы

То, что вы написали, называется занятым циклом, который вы никогда не должны делать.

Возможно, вы захотите продолжать делать это, но, по крайней мере, спать немного, чтобы не быть занятым зацикливанием, который все еще не так здорово:

while( !hasPerformedAction() ) {
    (sleep a bit here)
}

Еще один способ сделать это, чтобы позволить пользователю действия в очереди блокировки: тогда вы можете просто использовать очередь И реализация очереди позаботится о проблеме для вас.

И еще один способ использовать обратный вызов для уведомления о действиях пользователя.

Учебники Java имеют хороший урок по параллелизму в Java:

http://java.sun.com/docs/books/tutorial/essential/concurrency/

Если вы собираетесь изменять UI из другого потока, вы захотите помнить:

SwingUtils.invokeLater(actionToInvoke);

Это график В ваших тегах, поэтому я предполагаю, что действие делается в графическом интерфейсе.

«Рекомендуемый» способ сделать эту вещь, для основного потока, чтобы поставить себя спать (возможно, используя wait()) и для GUI действий к notify() он обратно в бодрство, как только действие будет выполнено.

Есть несколько классов для этого в java.util.concurrent.locks. Отказ Посмотреть на класс LockSupport

С уважением Майка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top