import java.util.*; 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()*1000)); } 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(); System.out.println(" Bil fra venstre kjorer venstre del"); try { sleep(2); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} smallVei.taHoyre(); smallVei.friVenstre(); System.out.println(" Bil fra venstre kjorer hoyre del "); try { sleep(2); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} smallVei. friHoyre(); System.out.println(" Bil nr " + ind + " fra venstre har passert hele den smale veien "); System.out.println(); } 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()*1000)); } 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(); System.out.println(" Bil fra hoyre kjorer hoyre del"); try { sleep(2); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} smallVei.taVenstre(); smallVei. friHoyre(); System.out.println(" Bil fra hoyre kjorer venstre del"); try { sleep(2); } catch (InterruptedException e) { System.out.println("FEIL"); System.exit(1);} smallVei.friVenstre(); System.out.println(" Bil nr " + ind + " fra hoyre har passert den smale veien "); System.out.println(); } 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);} } // Na 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);} } // Na er hoyre ledig. Den er MIN! hoyreLedig = false; // opptatt for alle andre } synchronized void friHoyre() { hoyreLedig= true; notify(); } synchronized void friVenstre() { venstreLedig= true; notify(); } } 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 "); } }