Laborator 11

Lab 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: