Asafj, если вам нужно ждать события, которое произойдет в другом потоке, то while(!Update) - худшее, что можно придумать.
В Java с самого рождения разработан механизм wait - notify. Для отправки сигнала из потока 1 в поток 2 оба потока используют общий объект, я назову его signal (тип Object)
Поток 1, когда ему нужно отправить сигнал, использует такой код:
synchronized(signal) { signal.notify(); }
Поток 2 ожидает сигнал:
synchronized(signal) { signal.wait(); }
Недостаток этого решения в том, что второй поток должен вызвать wait до того, как первый отправит notify, в противном случае второй поток будет ждать бесконечно.
Более безопасным в этом смысле является CountDownLatch. Поток, который ждет сигнала, вызвает
latch.await();
Поток, который посылает сигнал, делает
latch.countDown();
Недостаток этого решения в том, что сигнал можно отправить только один раз.
Наиболее общий способ - воспользоваться синхронизированными контейнерами. Например
ArrayBlockingQueue или
SynchronousQueueПоток, который ждет сигнал, вызвает
queue.take();
Поток, отправляющий сигнал, вызывает
queue.offer(x);