import java.util.*; // Program som viser at vranglaas (deadlock) kan oppstaa // Skrevet av Stein Gjessing 2013 - 2014 - 2015 - 2016 class BilEn extends Thread { Veistump smallVei; BilEn(Veistump vei) {smallVei = vei;} public void run ( ) { for (int ind = 0; ind < 100; ind ++) { try { sleep((int)(SmaltVeistykke.ran.nextFloat()*100)); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} System.out.println(" Bil nr " + ind + " fra venstre skal passere den smale veien "); smallVei.taVenstre(); try { sleep(5); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} smallVei.taHoyre(); // kjor System.out.println(" Bil fra venstre kjorer "); smallVei.friVenstre(); smallVei. friHoyre(); System.out.println(" Bil nr " + ind + " fra venstre har passert den smale veien "); } System.out.println(" 100 biler har passert fra venste "); } } class BilTo extends Thread { Veistump smallVei; BilTo(Veistump vei) {smallVei = vei;} public void run ( ) { for (int ind = 0; ind < 100; ind ++) { try { sleep((int)(SmaltVeistykke.ran.nextFloat()*100)); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} System.out.println(" Bil nr " + ind + " fra hoyre skal passere den smale veien "); smallVei.taHoyre(); try { sleep(5); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} smallVei.taVenstre(); // kjor System.out.println(" Bil fra hoyre kjorer "); smallVei. friHoyre(); smallVei.friVenstre(); System.out.println(" Bil nr " + ind + " fra hoyre har passert den smale veien "); } System.out.println(" 100 biler har passert fra hoyre "); } } class Veistump { private boolean venstreLedig = true; private boolean hoyreLedig = true; synchronized void taVenstre() { while (! venstreLedig) { try { wait(); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} } // Naa er venstreLedig. Den er MIN! venstreLedig = false; // opptatt for alle andre } synchronized void taHoyre() { while (! hoyreLedig) { try { wait(); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} } // Naa er hoyre ledig. Den er MIN! hoyreLedig = false; // opptatt for alle andre } synchronized void friHoyre() { hoyreLedig= true; notifyAll(); } synchronized void friVenstre() { venstreLedig= true; notifyAll(); } } class SmaltVeistykke { static Random ran = new Random(); public static void main (String[] args) { Scanner inn = new Scanner(System.in); System.out.println(" "); System.out.println(" Main starter "); Veistump denneVeien = new Veistump(); BilEn bilenTilHans = new BilEn(denneVeien); BilTo bilenTilEva = new BilTo(denneVeien); bilenTilHans.start(); bilenTilEva.start(); System.out.println( ); // inn.nextLine(); System.out.println(" Main er ferdig "); } }