Laborator 11
Problema 1:
class Benzinarie{
private final int capacitateMaxima=1000;
private int capaciateCurenta;
public int getCapaciateCurenta() {
return capaciateCurenta;
}
public void setCapaciateCurenta(int capaciateCurenta) {
this.capaciateCurenta = capaciateCurenta;
}
public int getCapacitateMaxima() {
return capacitateMaxima;
}
public String toString(){
return "Capacitate curenta benzinarie: "+this.capaciateCurenta+"\n";
}
}
class Vehicul {
private int capacitate;
public Vehicul(int capacitate){
this.capacitate=capacitate;
}
protected int getCapacitate() {
return capacitate;
}
protected void setCapacitate(int capacitate) {
this.capacitate = capacitate;
}
public String toString(){
return "Capacitate curenta vehicul: "+this.capacitate+"\n";
}
}
class VehiculCareUmpleBenzinaria extends Vehicul {
public VehiculCareUmpleBenzinaria(int capacitate){
super(capacitate);
}
public synchronized void umpleBenzinaria(Benzinarie benzinarie){
while(benzinarie.getCapaciateCurenta()==benzinarie.getCapacitateMaxima()){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
if(super.getCapacitate()==0) {
notifyAll();
Thread.currentThread().stop();
}
int capacitateDeUmplut = (int) (Math.random()*super.getCapacitate())+1;
if(benzinarie.getCapaciateCurenta()+capacitateDeUmplut>benzinarie.getCapacitateMaxima()){
int umplut=benzinarie.getCapacitateMaxima()-benzinarie.getCapaciateCurenta();
benzinarie.setCapaciateCurenta(benzinarie.getCapacitateMaxima());
super.setCapacitate(super.getCapacitate()-umplut);
capacitateDeUmplut=umplut;
}
else {
benzinarie.setCapaciateCurenta(benzinarie.getCapaciateCurenta() + capacitateDeUmplut);
super.setCapacitate(super.getCapacitate()-capacitateDeUmplut);
}
notifyAll();
System.out.println("Umplu: "+capacitateDeUmplut+" " +this.toString()+" "+benzinarie.toString());
}
}
class VehiculCareGolesteBenzinaria extends Vehicul {
public VehiculCareGolesteBenzinaria(int capacitate){
super(capacitate);
}
public synchronized void golesteBenzinaria(Benzinarie benzinarie){
while(benzinarie.getCapaciateCurenta()==0 ){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
if(super.getCapacitate()==0) {
notifyAll();
Thread.currentThread().stop();
}
int capacitateDeGolit= (int) (Math.random()*super.getCapacitate())+1;
if(benzinarie.getCapaciateCurenta()-capacitateDeGolit<=0){
int golit=benzinarie.getCapaciateCurenta();
benzinarie.setCapaciateCurenta(0);
super.setCapacitate(super.getCapacitate()-golit);
capacitateDeGolit=golit;
}
else {
benzinarie.setCapaciateCurenta(benzinarie.getCapaciateCurenta() - capacitateDeGolit);
super.setCapacitate(super.getCapacitate()-capacitateDeGolit);
}
notifyAll();
System.out.println("Golesc: " +capacitateDeGolit + " " +this.toString()+" "+benzinarie.toString());
}
}
class Cisterna extends VehiculCareUmpleBenzinaria {
public Cisterna(int capacitate){
super(capacitate);
}
}
class Masina extends VehiculCareGolesteBenzinaria {
public Masina(int capacitate){
super(capacitate);
}
}
class GolesteBenzinarie extends Thread{
private Benzinarie benzinarie;
private VehiculCareGolesteBenzinaria vehicul;
public GolesteBenzinarie(Benzinarie benzinarie, VehiculCareGolesteBenzinaria vehicul){
this.benzinarie=benzinarie;
this.vehicul=vehicul;
}
public void run(){
while(true) {
vehicul.golesteBenzinaria(benzinarie);
}
}
}
class UmpleBenzinarie extends Thread{
private Benzinarie benzinarie;
private VehiculCareUmpleBenzinaria vehicul;
public UmpleBenzinarie(Benzinarie benzinarie, VehiculCareUmpleBenzinaria vehicul){
this.benzinarie=benzinarie;
this.vehicul=vehicul;
}
public void run(){
while(true) {
vehicul.umpleBenzinaria(benzinarie);
}
}
}
public class Main {
public static void main(String[] args) {
Benzinarie benzinarie=new Benzinarie();
Vehicul masina =new Masina(60);
Vehicul cisterna =new Cisterna(5000);
new UmpleBenzinarie(benzinarie,(VehiculCareUmpleBenzinaria)cisterna).start();
new GolesteBenzinarie(benzinarie,(VehiculCareGolesteBenzinaria)masina).start();
}
}
output:
Umplu: 1000 Capacitate curenta vehicul: 4000
Capacitate curenta benzinarie: 971
Golesc: 29 Capacitate curenta vehicul: 31
Capacitate curenta benzinarie: 971
Golesc: 2 Capacitate curenta vehicul: 29
Capacitate curenta benzinarie: 998
Golesc: 11 Capacitate curenta vehicul: 18
Capacitate curenta benzinarie: 987
Golesc: 13 Capacitate curenta vehicul: 5
Capacitate curenta benzinarie: 974
Golesc: 5 Capacitate curenta vehicul: 0
Capacitate curenta benzinarie: 969
Umplu: 29 Capacitate curenta vehicul: 3971
Capacitate curenta benzinarie: 1000
Umplu: 31 Capacitate curenta vehicul: 3940
Capacitate curenta benzinarie: 1000
Problema 2: