Нужен ли семафор для моей темы в Android / Java? - PullRequest
0 голосов
/ 03 июня 2010

При запуске потока в Android / Java:

public void run()
{
   while (running)
   {
      if (moreTasksToExec())
      {
         task = getNextTask()
         task.exec();
      }
   }
}

Можно ли разрешить запуск и не использовать семафор для блокировки, пока не нужно выполнять никаких действий?

Я использую только один поток, поэтому мне не нужна синхронизация между потоками.

Ответы [ 3 ]

2 голосов
/ 03 июня 2010

Два потока могут получить одну и ту же следующую задачу и попытаться запустить одну и ту же задачу одновременно. Так что я бы так подумал.

1 голос
/ 05 июня 2010

Возможно, вам будет лучше:

public void run()
{
  while (true) {
    task = getNextTask();  // blocks until task available
    if (task == null)
      break;
  }
}

getNextTask () возвращает ноль, если пришло время прекратить работу. В качестве альтернативы, проверьте «task == STOP_TASK» и установите любой код, который в данный момент установлен, на выполнение = false после STOP_TASK в очередь задач.

Другой подход состоит в том, чтобы использовать Thread.interrupt (), чтобы разбудить спящего, но это всегда выглядит как-то неряшливо. : -)

Если вы сохраняете описанный выше подход, убедитесь, что «рабочий» объявлен как volatile, если он может быть изменен другим потоком.

0 голосов
/ 03 июня 2010

Вы должны хотя бы поспать там, чтобы не перегружать процессор.

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