Иллюстрированный самоучитель по Java



     Двери Железнодорожный на dverimetal.com. |          

Согласование работы нескольких подпроцессов - часть 2


Обратимся снова к схеме "поставщик-потребитель", уже использованной в

главе 15.

Один подпроцесс, поставщик, производит вычисления, другой, потребитель, ожидает результаты этих вычислений и использует их по мере поступления. Подпроцессы передают информацию через общий экземпляр st класса store.

Работа этих подпроцессов должна быть согласована. Потребитель обязан ждать, пока поставщик не занесет результат вычислений в объект st, а поставщик должен ждать, пока потребитель не возьмет этот результат.

Для простоты поставщик просто заносит в общий объект класса store целые числа, а потребитель лишь забирает их.

В листинге 17.6 класс store не обеспечивает согласования получения и выдачи информации. Результат работы показан на рис. 17.4.

Листинг 17.6.

Несогласованные подпроцессы

class Store{

private inf inform;

synchronized public int getlnform(){ return inform; } 

synchronized public void setlnform(int n){ inform = n; } 

}

class Producer implements Runnable{ 

private Store st; 

private Thread go; 

Producer(Store st){ 

this.st = st; 

go = new Thread(this); 

go.start(); 

}

public void run(){ 

int n = 0;

Thread th = Thread.currentThread(); 

while(go == th){ 

st.setlnform(n);

System.out.print("Put: " + n + " "); 

n++; 

}

public void stop(){ go = null; 

}

class Consumer implements Runnable{ 

private Store st; 

private Thread go; 

Consumer(Store st){

this.st = st; 

go =-new Thread(this); 

go.start () ; 

public void run(){

Thread th = Thread.currentThread();

while(go == th) System.out.println("Got: " + st.getlnformf)); 

}

public void stop(){ go = null; } 

class ProdCons{

public static void main(String[] args){ 

Store st = new Store(); 

Producer p = new Producer(st); 




Содержание  Назад  Вперед