2009-12-13 2 views
0

Я создал эту глупую программу, чтобы играть с wait()Понимание ожидания()

public class WaitTest { 
    public static void main(String [] args) { 

     System.out.print("1 "); 
     synchronized(args){ 

     System.out.print("2 "); 

     try { 
      args.wait(); 
      args.notifyAll(); 
     } 
     catch(InterruptedException e){ System.out.print("exception caught");} 

     System.out.print("3 "); 
     } 
    } 
} 

На моей машине, код никогда не получает печать 3, если я не пишу wait(100) или другое количество миллисекунд. Почему это?

+5

Не могли бы вы попытаться прочесть хотя бы полчаса об определенной концепции, прежде чем задать еще один вопрос? – Bozho

+1

Это очень интересное предложение, спасибо. Вы были очень полезны. – andandandand

+2

хорошо, я был полезен, предоставляя вам ответ. Теперь взамен вы должны серьезно относиться к моим комментариям;) – Bozho

ответ

7

Вы делаете wait() перед notifyAll(). wait() будет блокироваться. Когда вы введете значение таймаута, wait() будет тайм-аут, а затем ваша программа будет продолжена. Если вы хотите, чтобы ваша программа работала, создайте поток и сделайте свой notifyAll(). wait() и notifyAll предназначены для синхронизации interthread.

5

У вас только одна нить. wait() ожидает уведомления из другого потока.

3

Поскольку ни одна другая нить не уведомляет монитор объекта, которого вы ожидаете, он просто блокируется. И поскольку вы синхронизируете и ожидаете локальную переменную, вряд ли любой другой поток сможет вызвать на нем notify().

+0

Спасибо, это спасло мне время (и предоставило контент для других, чтобы узнать). Приятно, мужик. – andandandand

6

wait и notifyAll предназначены для многопоточности. args.wait() будет ждать навсегда до какой-либо другой темы называет args.notifyAll() или args.notify().

Когда вы звоните args.wait(100), он ждет 100 мс, тайм-аут и продолжение.

Если вы знакомы с семафорами, это в основном то, что ждут/уведомляются.

1

От http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html

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

Java-учебник является отличным учебный ресурс.

 Смежные вопросы

  • Нет связанных вопросов^_^