import java.util.ArrayList; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.CountDownLatch; public class Hovedprogram { static final int antProdusenter = 10; public static void main(String[] args) { FryseMonitor monitor = new FryseMonitor(); CountDownLatch barriere = new CountDownLatch(antProdusenter); Runnable vp = new Vaksineprodusent(monitor, barriere); Runnable vs = new VaksineSetter(monitor); ArrayList vaksineprodusenter = new ArrayList<>(); ArrayList vaksinesettere = new ArrayList<>(); for (int i = 0; i <= antProdusenter; i++) { Thread nyProd = new Thread(vp); Thread nySetter = new Thread(vs); vaksineprodusenter.add(nyProd); nyProd.start(); vaksinesettere.add(nySetter); nySetter.start(); } try { barriere.await(); } catch (InterruptedException e) { System.out.println(e); } System.out.println("Produsenter er ferdig med å produsere."); monitor.faarInnNyeVaksiner = false; try { for (Thread prod : vaksinesettere) { prod.join(); } } catch (InterruptedException e) { System.out.println(e); } System.out.println("Sykepleiere ferdig."); } } class FryseMonitor { final int MAX_VAKSINE_KAPASITET = 100; private ReentrantLock laas = new ReentrantLock(); private Condition ikkeFull = laas.newCondition(); private Condition ikkeTom = laas.newCondition(); boolean faarInnNyeVaksiner = true; private ArrayList vaksiner = new ArrayList(); public void settInnVaksine(String vaksine) { laas.lock(); try { while (vaksiner.size() >= MAX_VAKSINE_KAPASITET) { ikkeFull.await(); } vaksiner.add(vaksine); ikkeTom.signalAll(); } catch (InterruptedException e) { System.out.println(); } finally { laas.unlock(); } } public String hentUtVaksine(){ laas.lock(); try { while (vaksiner.size() == 0) { ikkeTom.await(); } String uttattVaksine = vaksiner.remove(0); ikkeFull.signalAll(); return uttattVaksine; } catch (InterruptedException e) { System.out.println(e); return "Dårlig vaksine"; } finally { laas.unlock(); } } public boolean vaksineringPaagar() { return faarInnNyeVaksiner || vaksiner.size() > 0; } } class Vaksineprodusent implements Runnable { FryseMonitor monitor; CountDownLatch barriere; Vaksineprodusent(FryseMonitor fm, CountDownLatch cdl) { monitor = fm; barriere = cdl; } @Override public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(4); for (int j = 0; j < 10; j++) { monitor.settInnVaksine("Vaksine"); } System.out.println("Produsert og satt inn 10 vaksiner. "); } catch (InterruptedException e) { System.out.println(e); } } barriere.countDown(); } } class VaksineSetter implements Runnable { FryseMonitor monitor; VaksineSetter(FryseMonitor fm) { monitor = fm; } @Override public void run() { while (monitor.vaksineringPaagar()) { String vaksine = monitor.hentUtVaksine(); try { Thread.sleep(50); System.out.println("Satt "+ vaksine); Thread.sleep(50); System.out.println("Satt "+ vaksine); Thread.sleep(50); System.out.println("Satt "+ vaksine); Thread.sleep(50); System.out.println("Satt "+ vaksine); } catch (InterruptedException e) { System.out.println(4); } } } }