2015-10-12 5 views
0

Я новичок в многопоточности. В настоящее время я изучаю блокировку и уведомляю и синхронизирую блок. Я создал небольшую программу, чтобы проверить, как ждать и уведомлять работу с блоком синхронизации, если я не создам ни одного потока (я предполагаю, что основной поток получит блокировку). Ниже приведен код для лучшего понимания., когда поток освободит блокировку объекта?

public class Problem1 
{ 
    public void waitForSignal() throws InterruptedException 
    { 
     Object obj=new Object(); 
     synchronized (obj) { 
     obj.wait(); 
     obj.notify(); 
     } 
    } 
    public static void main(String args[]) throws InterruptedException 
    { 
     Problem1 pb=new Problem1(); 
     pb.waitForSignal(); 
     System.out.println("hello");//controll not come here 
    } 

} 

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

ожидания() говорит вызывающий поток отказаться от монитора и пойти спать, пока другой поток не входит в тот же монитор и вызывает уведомить() ,

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

+0

Возможный дубликат [java, wait, notify notifyall] (http://stackoverflow.com/questions/5999193/java-wait-notify-notifyall) – hotzst

ответ

3

Когда вы звоните wait, другой поток должен будет получить блокировку на obj и вызвать notify или notifyAll сигнализировать нить ожидания, чтобы продолжить. Самый простой способ понять - в контексте проблемы «Потребитель/Продюсер», и у Oracle есть довольно хороший учебник о that.

Прерывание нити - это нечто совершенно другое. Это запрос прерывистого потока, чтобы проверить его прерванный статус и завершить обработку. У Брайана Гетца есть замечательная статья об этом в контексте properly handling InterruptedException.

+0

Спасибо за ваш ответ, но если вы видите мою программу, не идет на вызов notify(), поэтому нет возможности генерировать какой-либо сигнал для ожидающего потока. Не могли бы вы объяснить это немного больше. возьмите ссылку на мою программу. –

+0

Элемент управления не переходит к вызову 'уведомление ', потому что поток заблокирован. Единственная причина, по которой вы будете использовать 'wait', - это координация действий с другим потоком. Я бы предложил оставить вашу программу в стороне и пройти через учебник. – sh0rug0ru

+0

Что вы ждете? Какое уведомление вы хотите сигнализировать? Я бы предложил получить хороший ответ на эти вопросы, прежде чем продолжить, потому что ожидание и уведомление из контекста приведет лишь к путанице. – sh0rug0ru

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