Jump to content
BulForum.com

Задача на Java


WriteR4e

Recommended Posts

Значи имам да правя една задача като използвам максимално дадения ми готов код, но се запънах. Задачата е за нишки, които ползват общ ресурс. Едната нишка произвежда ресурс (данни в буфер), който другата нишка използва. Двете нишки работят конкурентно по отношение на буфера. "Потребителят" трябва да чака при празен буфер. "Производителят" трябва да чака при пълен буфер. При синхронизацията на нишките едната нишка изчаква, докато другата нишка не и съобщи за възникването на определено събитие.

Надолу давам моя код, докъдето съм стигнал.

import java.awt.*;
import java.awt.event.*;

class Quantity2 {
int n; // buffer
PC pc;
boolean valueSet = false; // flag, proverqva dali buffera ima stoinost

// polu4avane na stoinost ot buffera
synchronized int get() {
   if (!valueSet)
	 try {
	 	pc.setThrd22(1);
	 	wait();  // postavq se stoinost v buffera i se deblokira nishkata chi
   } 
   catch(InterruptedException e) {};
   pc.setThrd22(2);
   valueSet = false;
   notify();  // prochita stoinostta ot buffera i deblokira nishkata pisatel
   pc.setThrd2(n);
   return n;
}

// Поставяне на стойност в буфера
synchronized void put(int n) {
   if (valueSet)
   	 try {
   	 	pc.setThrd1(n);
   	 	wait();  // prochita stoinostta ot buffera i deblokira nishkata pisatel
   	 	pc.setThrd11(1);
   }
   catch(InterruptedException e) {};
   this.n = n;
   valueSet = true;
   pc.setThrd11(2);
   notify();  // stoinostta se namira v bufera, sledovatelno deblokirame chitatelq
} 
	
//konstruktor
public Quantity2(PC pc){
	this.pc = pc;
}
}

// nishka 
class Producer implements Runnable { 
Quantity2 q;
Producer(Quantity2 q) { 
	this.q = q;
	new Thread(this, "Producer").start();
}

public void run() {  // pravi opit za zapis na 20 stoinosti

	for (int i = 0; i < 20; i++) { 
		q.put((int) (Math.random() *10));
	} 
} 
}

// nishka chitatel
class Consumer implements Runnable { 
Quantity2 q;
Consumer(Quantity2 q) {
	this.q = q;
	new Thread(this, "Consumer").start();
}

public void run() {  // pravi opiti za chetene ot bufera
	while (true) {
		q.get();
	}
}
}

//interface
class PC extends Frame implements ActionListener {  
Button startBtn;
Button stopBtn;
Label prodLbl1;
Label nothing1;
Label prodLbl2;
Label prodLbl3;
Label bufLbl;
Label consLbl1;
Label nothing2;
Label consLbl2;
Label consLbl3;
TextField txtProd;
TextField txtCons;
TextField txtBuf;

Panel south;
Panel east;
Panel center;
Panel west;
Panel eastUp;
Panel eastDown;
Panel westUp;
Panel westDown;
Panel centerDown;

public PC(){
	
	startBtn = new Button("Start");
	stopBtn = new Button("Stop");
	prodLbl1 = new Label("    Nishka");
	nothing1 = new Label("");
	prodLbl2 = new Label("    Producer");
	prodLbl3 = new Label("    Danni");
	bufLbl = new Label("     Buffer");
	consLbl1 = new Label("     Nishka");
	nothing2 = new Label("");
	consLbl2 = new Label("     Consumer");
	consLbl3 = new Label("     Danni");
	txtProd = new TextField("", 5);
	txtCons = new TextField("", 5);
	txtBuf = new TextField("", 5);
	this.setLayout(new BorderLayout());
	
	west = new Panel();
	west.setLayout(new BorderLayout());
	east = new Panel();
	east.setLayout(new BorderLayout());
	center = new Panel();
	center.setLayout(new BorderLayout());
	south = new Panel();
	south.setLayout(new BorderLayout());
	
	westUp = new Panel();
	westUp.setLayout(new GridLayout(3,1));
	westUp.add(prodLbl1);
	westUp.add(nothing1);
	westUp.add(prodLbl2);
	westDown = new Panel();
	westDown.setLayout(new GridLayout(2,1));
	westDown.add(txtProd);
	westDown.add(prodLbl3);
	west.add(westUp, BorderLayout.CENTER);
	west.add(westDown, BorderLayout.SOUTH);
	west.setBackground(Color.BLUE);
	
	eastUp = new Panel();
	eastUp.setLayout(new GridLayout(3,1));
	eastUp.add(consLbl1);
	eastUp.add(nothing2);
	eastUp.add(consLbl2);
	eastDown = new Panel();
	eastDown.setLayout(new GridLayout(2,1));
	eastDown.add(txtCons);
	eastDown.add(consLbl3);
	east.add(eastUp, BorderLayout.CENTER);
	east.add(eastDown, BorderLayout.SOUTH);
	east.setBackground(Color.YELLOW);
	
	centerDown = new Panel();
	centerDown.setLayout(new GridLayout(2, 1));
	centerDown.add(txtBuf);
	centerDown.add(bufLbl);
	center.add(centerDown, BorderLayout.SOUTH);
	
	south.setLayout(new FlowLayout());
	south.add(startBtn);
	south.add(stopBtn);
	
	add(west, BorderLayout.WEST);
	add(center, BorderLayout.CENTER);
	add(east, BorderLayout.EAST);
	add(south, BorderLayout.SOUTH);
	
	startBtn.addActionListener(this);
	stopBtn.addActionListener(this);
	
	addWindowListener(new WindowClose());
	
	setSize(250,180);
	setVisible(true);
	setTitle("Producer/Consumer");
}

public void setThrd1(int th1){
       String b = Integer.toString(th1);
       txtProd.setText(;
   }
   
   public void setThrd2(int th2){
       String b = Integer.toString(th2);
       txtCons.setText(;
   }
   
   public void setThrd11(int th1){
       if (th1 == 1){
       txtProd.setBackground(Color.red);
       }
       else{
       txtProd.setBackground(Color.WHITE);
       }
   }

public void setThrd3(int th3){
       String b = Integer.toString(th3);
       txtBuf.setText(;
   }

public void setThrd22(int th2){
       if (th2 == 1){
       txtCons.setBackground(Color.red);
       }
       else{
       txtCons.setBackground(Color.WHITE);
       }
   }
   
   public void actionPerformed(ActionEvent ae){
   	Button b = (Button) ae.getSource();
   	if (b.equals(startBtn)){
   	}
   }
   
   class WindowClose extends WindowAdapter{
   	public void windowClosing(WindowEvent we){
   		System.exit(0);
   	}
   }

public static void main(String args[]) {
	PC pc1 = new PC();
	Quantity2 q = new Quantity2(pc1);
	new Producer(q);
	new Consumer(q);
} 
}

 

Готовият код, за който споменах в началото, съдържа само класовете и методите, като съм направил малко промени, за да работи с интерфейса, който също липсваше.

 

Това се иска от мен от тук нататък: При стартирането на приложението се илюстрира как най-напред се задава стойност на вътрешната променлива на нишката Producer (лявото текстово поле), как тази стойност се пренася в буфера (централното текстово поле) и как след това тази стойност се прочита във вътрешната променлива на нишката Consumer (дясното текстово поле). При блокиране на някоя от нишките поради заетост или неготовност на буфера, съответното текстово поле (txtSource или txtDest) на съответната вътрешна променлива променя цвета си в червен (за периода на блокиране).

 

Преди да го направя това, обаче имам проблем как да наглася listener-ите на Start и Stop. Знам как става, но нишките са ми в отделни класове, интерфеиса също, а пък не мога да ги наследя и въобще ми е малко зор тая част...

 

Знам, че е доста занимавка задачата, но кисна от няколко часа и нищо не ми идва. Ще разбера, ако не ви се занимава, щото трябва повече желание и време. Не мислех да питам въобще, но ми е спешно и... така... :)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...