import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; class RunObjekt implements Runnable { // en oppgave Monitor monitor; private static int sum = 0; public RunObjekt(Monitor monitor) { this.monitor = monitor; } @Override public void run() { // oppgaven en tr?d kan utf?re int teller = 0; while (teller < 35) { teller++; //"l?s den delte ressursen her, andre tr?der m? vente p? tur" monitor.increment(); System.out.println("sum: " + monitor.getSum()); //"?pne den delte ressursen her, andre tr?der kan n? kalle p? sum++" } System.out.println("Produsent ferdig, sum: " + monitor.getSum()); } } class Konsument implements Runnable { private Monitor monitor; public Konsument(Monitor monitor) { this.monitor = monitor; } @Override public void run() { int teller = 0; while (teller < 10) { teller++; monitor.decrement(); System.out.println("sum: " + monitor.getSum()); } System.out.println("Konsument ferdig, sum: " + monitor.getSum()); } } class Monitor { Lock laas = new ReentrantLock(); Condition ventPaaProdusent = laas.newCondition(); int sum = 0; public void increment() { laas.lock(); try { sum++; ventPaaProdusent.signal(); } finally { laas.unlock(); } } public void decrement() { laas.lock(); try { if (sum <= 0) { ventPaaProdusent.await(); } sum--; } catch (InterruptedException e) { System.out.println(e); } finally { laas.unlock(); } } public int getSum() { return sum; } } class Hovedprogram { public static void main(String[] args) { Monitor monitor = new Monitor(); RunObjekt run1 = new RunObjekt(monitor); RunObjekt run2 = new RunObjekt(monitor); Konsument kons1 = new Konsument(monitor); // run1.run(); // run1.run(); Thread traad1 = new Thread(run1); Thread traad2 = new Thread(run2); Thread traad3 = new Thread(kons1); Thread traad4 = new Thread(kons1); Thread traad5 = new Thread(kons1); traad1.start(); // oker sum traad2.start(); traad3.start(); // senker sum traad4.start(); traad5.start(); } }