Спите в потоке, пока событие не будет посещено в другом потоке - PullRequest
27 голосов
/ 23 сентября 2008

У меня есть два потока в приложении Android, один - поток представления, а другой - рабочий поток. Я хочу перевести рабочий поток в спящий режим, пока поток представления не завершит обработку метода onDraw.

Как я могу это сделать? есть ли ждать сигнала или что-то?

Ответы [ 2 ]

38 голосов
/ 23 сентября 2008

Обмен java.lang.Object между двумя потоками, единственная цель которого - сообщить рабочему потоку, когда он сможет продолжить свою работу. Всякий раз, когда рабочий поток достигает точки, где он должен спать, он делает это:

stick.wait();

Когда поток представления заканчивает свою работу onDraw, он вызывает это:

stick.notify();

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

void onDraw() {
  ...
  synchronized (stick) {
    stick.notify();
  }
} // end onDraw()

Обратитесь к javadoc для java.lang.Object для этих методов (и notifyAll, на всякий случай); они очень хорошо написаны.

2 голосов
/ 23 сентября 2008

Если вам нужен высокоуровневый API параллелизма (с такими вещами, как Barriers), вы можете попробовать бэкпорт API параллелизма java 5, который работает на Java 1.3 и выше и может работать на Android. Подобные Object.wait / notify будут работать, но они могут быть немного краткими.

Backport-Util-параллельный

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