Как ждать инициализации потока и обработчика - PullRequest
0 голосов
/ 11 октября 2011

Я пишу заявку.Я столкнулся со сценарием таким образом, что мне нужно создать два потока, поток 1 будет создан первым, а поток 2 будет создан вторым.Thread1 должен отправить в обработчик thread2.Но поскольку система работает быстро, до того, как поток thread2 был создан и обработчик инициализирован, thread1 начал публиковать объекты сообщения в thread2.Из-за чего я сталкиваюсь с неожиданным поведением.

Пожалуйста, дайте мне знать, как ждать в потоке 1, чтобы поток 2 запустился, и обработчик инициализирован.Я попробовал механизм опроса, так как он влияет на производительность системы, это исправление не принимается.

Ответы [ 5 ]

1 голос
/ 11 октября 2011

Просто используйте что-то подобное:

// @ Thread 1
synchronized( someMonitor ) {
  someMonitor.wait( /* time? */ );
}

// @ Thread 2
synchronized( someMonitor ) {
  someMonitor.notify();
}

Таким образом, поток 1 будет ждать, пока поток 2 не уведомит. Я бы перед ожиданием проверил, если условие уже установлено.

0 голосов
/ 12 октября 2011

Ваш первый вариант - сделать глобальную очередь сообщений.

Второй - создать поток 2 из потока 1.

Третье - иметь объект синхронизации (Object.wait, notify, interrupt).

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

0 голосов
/ 11 октября 2011

Вам нужно переосмыслить свой дизайн: похоже, вы работаете над моделью «производитель / потребитель», поэтому вы можете использовать (блокирующую) очередь для обмена сообщениями. Создайте его из обоих потоков и передайте его и производителю, и потребителю во время создания. В этой ситуации не имеет значения, какой поток начнет выполняться первым: если производитель, то очередь начинает заполняться, если потребитель, то он также будет ждать, пока производитель не запустится.

0 голосов
/ 11 октября 2011
0 голосов
/ 11 октября 2011

Другой способ - создать поток 2 из потока 1, чтобы очередь или что-то еще, что этот поток 2 использовал для ввода, была создана до того, как поток 1 приступил к публикации материала.

Rgds, Martin

...