import java.util.ArrayList; import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; import java.util.concurrent.CountDownLatch; import java.io.File; import java.io.PrintWriter; import java.io.FileNotFoundException; //Barnehage tilsvarer en monitor-klasse public class Barnehage{ private final int ANT_BARN; private ArrayList barneliste; private ArrayList lekeliste; Lock lock = new ReentrantLock(); Condition finnesLeke = lock.newCondition(); CountDownLatch cdl; Barnehage(int antbarn, ArrayList leker){ ANT_BARN = antbarn; lekeliste = leker; barneliste = new ArrayList(); cdl = new CountDownLatch(ANT_BARN); } //Metoden skal starte alle tr?dene (barna) //I tillegg skal metoden ta i mot barna p? slutten av dagen. public void barnehagedag(){ ArrayList traader = new ArrayList<>(); for(Barn barn : barneliste){ Thread traad = new Thread(barn); traader.add(traad); traad.start(); } try{ cdl.await(); }catch(InterruptedException e){ } System.out.println("Barna kom seg hjem."); } //Metoden kalles av et barn, og returnerer en string leke til barnet //Leken fjernes fra Barnehagens lekeliste //Husk concurrency! public String laanLeke(Barn barn){ lock.lock(); try{ while(lekeliste.isEmpty()){ try{ finnesLeke.await(); }catch(Exception e){ } } return lekeliste.remove(0); }finally{ lock.unlock(); } } //Metoden kalles av et barn, og setter en leke inn i Barnehagens lekeliste //Husk concurrency! public void giLeke(String leke, Barn barn){ lock.lock(); try{ lekeliste.add(leke); finnesLeke.signalAll(); }finally{ lock.unlock(); } } public void leggTilBarn(String navn, ArrayList leker){ barneliste.add(new Barn(navn, leker, this, cdl)); } //Metoden skal skrive tilbake til fil p? samme format som ble lest inn //Husk ? skrive alle barn i barnelisten, og alle barn sine lekelister public void skrivBarnehage() { PrintWriter pw = null; try{ pw = new PrintWriter("espira2.in"); }catch(FileNotFoundException e){ System.out.println("Finner ikke fil."); System.exit(-1); } pw.println("Espira " + ANT_BARN); String leker = ""; for(String s : lekeliste){ leker += s + ", "; } pw.println(leker); for(Barn b : barneliste){ pw.println(b.getNavn()); leker = ""; for(String s : b.getLeker()){ leker += s + ", "; } if(leker.equals("")){ pw.println(""); }else{ pw.println(leker); } } pw.close(); } }