2015-06-05 3 views
-5

Я нашел этот код в своем приложении, и я получаю разные результаты в разное время. Я запутался. Расскажите, пожалуйста, о возможном выполнении кода. Благодарю.Невозможно понять поток выполнения кода многопоточности

import java.util.Vector; 

class Producer extends Thread { 

static final int MAXQUEUE = 5; 
private Vector messages = new Vector(); 

@Override 
public void run() { 
    try { 
     while (true) { 
      putMessage(); 
      //sleep(5000); 
     } 
    } catch (InterruptedException e) { 
    } 
} 

private synchronized void putMessage() throws InterruptedException { 
    while (messages.size() == MAXQUEUE) { 
     wait(); 
    } 
    messages.addElement(new java.util.Date().toString()); 
    System.out.println("put message"); 
    notify(); 
    //Later, when the necessary event happens, the thread that is  running it calls notify() from a block synchronized on the same object. 
} 

// Called by Consumer 
public synchronized String getMessage() throws InterruptedException { 
    notify(); 
    while (messages.size() == 0) { 
     wait();//By executing wait() from a synchronized block, a thread gives up its hold on the lock and goes to sleep. 
    } 
    String message = (String) messages.firstElement(); 
    messages.removeElement(message); 
    return message; 
    } 
} 



class Consumer extends Thread { 

Producer producer; 

Consumer(Producer p) { 
    producer = p; 
} 

@Override 
public void run() { 
    try { 
     while (true) { 
      String message = producer.getMessage(); 
      System.out.println("Got message: " + message); 
      //sleep(200); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String args[]) { 
    Producer producer = new Producer(); 
    producer.start(); 
    new Consumer(producer).start(); 
} 
} 

Сообщите нам об этом через несколько шагов. Спасибо.

+0

Какие выходные вы получаете? –

+0

Планирование потоков непредсказуемо, поэтому вы получаете разные выходы в разное время. Что вас удивило? Можете ли вы привести пример результата, которого вы не ожидали? – Jesper

ответ

1

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

new java.util.Date() 

может привести к хаотичности также, но это очень легко избежать из-за наличие замков. У вашего кода также есть блокировка с использованием ключевого слова JAVA «synchronized» для методов. Когда метод имеет «синхронизирован», что равно вы используете

synchronized(this) {...} 

Что означает различные темы, не может работать в тот же объект производителя {...}, в то же время. Производитель называет notify() после помещения одного элемента в вектор, что означает, что продюсер говорит: «Вектор не пуст, пожалуйста, извлеките что-нибудь из него» для потребителя. Потребитель вызывает notify() после получения одного элемента из вектора, что означает, что потребитель говорит: «Вектор не заполнен, пожалуйста, поместите его в него» производителю.

Чтобы узнать это ясно, пожалуйста, изучая основы замков и условий в JAVA.

0

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

Проблема производителя-потребителя очень популярна и важна для понимания того, как потоки работают с афорой синхронно. Ознакомьтесь с этой статьей для получения дополнительных разъяснений: http://ankitsambyal.blogspot.com/2014/02/mutex-in-java-explained-using-producer.html

Надеюсь, это поможет!

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