//////////////////////////////////////////////////////////////////////// // // Description: // // Internet: http://bioinformatik.gloomit.de // // Copyright (C) 2006 Phillip Kroll // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // //////////////////////////////////////////////////////////////////////// /*------------------------------------------------------------------------ Klasse: MainClass, Hauptprogramm ------------------------------------------------------------------------*/ public class MainClass { public static void main(String[] args) { // eine Bahnstrecke erstellen, und die // Fahrtzeit übergeben Bahnstrecke bahnstrecke = new Bahnstrecke( 0 ); // Anzahl der Züge die erstellt werden sollen int trains = 100; // Züge erstellen und auf die Bahnstrecke schicken for ( int i = 0; i < trains; i++ ){ new Zug( bahnstrecke, "ZUG" + ( i + 1000 ) ); } } } /*------------------------------------------------------------------------ Klasse: Bahnstrecke, Thread Synchronisierung ------------------------------------------------------------------------*/ public class Bahnstrecke { private int EastTrains = 0; private int WestTrains = 0; private int TravelTime = 3; private int EastMax = 3; private int WestMax = 3; public Bahnstrecke( int TravelTime ){ this.TravelTime = TravelTime; } // Neuen Zug richtung Osten registrieren. // Falls Züge richtung Westen unterwegs sind oder die maximale // Anzahl an Zügen die Richtung Osten fahren erreicht ist, wird // der Zug-Thread auf warten gesetzt public synchronized void GoEast( Zug train ){ while( ( WestTrains > 0 ) | ( EastTrains >= EastMax ) ){ try { wait(); } catch( InterruptedException e){} } EastTrains++; System.out.println( train.GetSerialNumber() + " goes East. " + GetRailwayStatus()); } // Neuen Zug richtung Westen registrieren. // Falls Züge richtung Osten unterwegs sind oder die maximale // Anzahl an Zügen die Richtung Westen fahren erreicht ist, wird // der Zug-Thread auf warten gesetzt public synchronized void GoWest( Zug train ){ while( ( EastTrains > 0 ) | ( WestTrains >= WestMax ) ){ try { wait(); } catch( InterruptedException e){} } WestTrains++; System.out.println( train.GetSerialNumber() + " goes West. " + GetRailwayStatus() ); } // Bahnstrecke im Osten verlassen public synchronized void LeaveToTheEast( Zug train ){ notifyAll(); if ( EastTrains > 0 ) EastTrains--; System.out.println( train.GetSerialNumber() + " left East. " + GetRailwayStatus()); } // Bahnstrecke im Westen verlassen public synchronized void LeaveToTheWest( Zug train ){ notifyAll(); if ( WestTrains > 0 ) WestTrains--; System.out.println( train.GetSerialNumber() + " left West. " + GetRailwayStatus()); } public int GetTravelTime(){ return TravelTime; } // Status String für die Bahnstrecke erstellen public String GetRailwayStatus(){ return ( "(East Trains: " + EastTrains + " West Trains: " + WestTrains + ")" ); } } /*------------------------------------------------------------------------ Klasse: Zug, Thread ------------------------------------------------------------------------*/ public class Zug extends Thread{ private Bahnstrecke bahnstrecke; private String SerialNumber; public Zug( Bahnstrecke bahnstrecke, String SerialNumber ){ this.bahnstrecke = bahnstrecke; this.SerialNumber = SerialNumber; start(); } public String GetSerialNumber(){ return SerialNumber; } public void run(){ // Zug soll zufällig nach Osten oder Westen fahren if ( (int)( Math.random() + 0.5 ) == 1 ){ // Fahrt nach Osten bahnstrecke.GoEast( this ); // Fahr druch sleep simulieren try { sleep( bahnstrecke.GetTravelTime() * 1000 ); } catch ( InterruptedException E ) {} // Bahnstrecke nach Osten verlassen bahnstrecke.LeaveToTheEast( this ); } else { // Fahrt nach Westen bahnstrecke.GoWest( this ); // Fahr druch sleep simulieren try { sleep( bahnstrecke.GetTravelTime() * 1000 ); } catch ( InterruptedException E ) {} // Bahnstrecke nach Westen verlassen bahnstrecke.LeaveToTheWest( this ); } } } /* Beispeil für Programmausgabe, 100 Züge ZUG1000 goes East. (East Trains: 1 West Trains: 0) ZUG1000 left East. (East Trains: 0 West Trains: 0) ZUG1001 goes West. (East Trains: 0 West Trains: 1) ZUG1003 goes West. (East Trains: 0 West Trains: 2) ZUG1005 goes West. (East Trains: 0 West Trains: 3) ZUG1001 left West. (East Trains: 0 West Trains: 2) ZUG1006 goes West. (East Trains: 0 West Trains: 3) ZUG1003 left West. (East Trains: 0 West Trains: 2) ZUG1005 left West. (East Trains: 0 West Trains: 1) ZUG1009 goes West. (East Trains: 0 West Trains: 2) ZUG1010 goes West. (East Trains: 0 West Trains: 3) ZUG1006 left West. (East Trains: 0 West Trains: 2) ZUG1015 goes West. (East Trains: 0 West Trains: 3) ZUG1009 left West. (East Trains: 0 West Trains: 2) ZUG1016 goes West. (East Trains: 0 West Trains: 3) ZUG1010 left West. (East Trains: 0 West Trains: 2) ZUG1015 left West. (East Trains: 0 West Trains: 1) ZUG1065 goes West. (East Trains: 0 West Trains: 2) ZUG1016 left West. (East Trains: 0 West Trains: 1) ZUG1017 goes West. (East Trains: 0 West Trains: 2) ZUG1018 goes West. (East Trains: 0 West Trains: 3) ZUG1065 left West. (East Trains: 0 West Trains: 2) ZUG1017 left West. (East Trains: 0 West Trains: 1) ZUG1018 left West. (East Trains: 0 West Trains: 0) ZUG1014 goes East. (East Trains: 1 West Trains: 0) ZUG1021 goes East. (East Trains: 2 West Trains: 0) ZUG1022 goes East. (East Trains: 3 West Trains: 0) ZUG1014 left East. (East Trains: 2 West Trains: 0) ZUG1023 goes East. (East Trains: 3 West Trains: 0) ZUG1021 left East. (East Trains: 2 West Trains: 0) ZUG1022 left East. (East Trains: 1 West Trains: 0) ZUG1023 left East. (East Trains: 0 West Trains: 0) ZUG1019 goes West. (East Trains: 0 West Trains: 1) ZUG1020 goes West. (East Trains: 0 West Trains: 2) ZUG1024 goes West. (East Trains: 0 West Trains: 3) ZUG1019 left West. (East Trains: 0 West Trains: 2) ZUG1020 left West. (East Trains: 0 West Trains: 1) ZUG1024 left West. (East Trains: 0 West Trains: 0) ZUG1025 goes East. (East Trains: 1 West Trains: 0) ZUG1027 goes East. (East Trains: 2 West Trains: 0) ZUG1032 goes East. (East Trains: 3 West Trains: 0) ZUG1025 left East. (East Trains: 2 West Trains: 0) ZUG1034 goes East. (East Trains: 3 West Trains: 0) ZUG1027 left East. (East Trains: 2 West Trains: 0) ZUG1032 left East. (East Trains: 1 West Trains: 0) ZUG1034 left East. (East Trains: 0 West Trains: 0) ZUG1026 goes West. (East Trains: 0 West Trains: 1) ZUG1028 goes West. (East Trains: 0 West Trains: 2) ZUG1029 goes West. (East Trains: 0 West Trains: 3) ZUG1026 left West. (East Trains: 0 West Trains: 2) ZUG1028 left West. (East Trains: 0 West Trains: 1) ZUG1029 left West. (East Trains: 0 West Trains: 0) ZUG1030 goes West. (East Trains: 0 West Trains: 1) ZUG1031 goes West. (East Trains: 0 West Trains: 2) ZUG1033 goes West. (East Trains: 0 West Trains: 3) ZUG1030 left West. (East Trains: 0 West Trains: 2) ZUG1031 left West. (East Trains: 0 West Trains: 1) ZUG1033 left West. (East Trains: 0 West Trains: 0) ZUG1035 goes West. (East Trains: 0 West Trains: 1) ZUG1036 goes West. (East Trains: 0 West Trains: 2) ZUG1040 goes West. (East Trains: 0 West Trains: 3) ZUG1035 left West. (East Trains: 0 West Trains: 2) ZUG1036 left West. (East Trains: 0 West Trains: 1) ZUG1040 left West. (East Trains: 0 West Trains: 0) ZUG1037 goes East. (East Trains: 1 West Trains: 0) ZUG1038 goes East. (East Trains: 2 West Trains: 0) ZUG1039 goes East. (East Trains: 3 West Trains: 0) ZUG1037 left East. (East Trains: 2 West Trains: 0) ZUG1038 left East. (East Trains: 1 West Trains: 0) ZUG1039 left East. (East Trains: 0 West Trains: 0) ZUG1041 goes East. (East Trains: 1 West Trains: 0) ZUG1042 goes East. (East Trains: 2 West Trains: 0) ZUG1045 goes East. (East Trains: 3 West Trains: 0) ZUG1041 left East. (East Trains: 2 West Trains: 0) ZUG1042 left East. (East Trains: 1 West Trains: 0) ZUG1045 left East. (East Trains: 0 West Trains: 0) ZUG1043 goes West. (East Trains: 0 West Trains: 1) ZUG1044 goes West. (East Trains: 0 West Trains: 2) ZUG1046 goes West. (East Trains: 0 West Trains: 3) ZUG1043 left West. (East Trains: 0 West Trains: 2) ZUG1044 left West. (East Trains: 0 West Trains: 1) ZUG1046 left West. (East Trains: 0 West Trains: 0) ZUG1047 goes East. (East Trains: 1 West Trains: 0) ZUG1051 goes East. (East Trains: 2 West Trains: 0) ZUG1054 goes East. (East Trains: 3 West Trains: 0) ZUG1047 left East. (East Trains: 2 West Trains: 0) ZUG1051 left East. (East Trains: 1 West Trains: 0) ZUG1054 left East. (East Trains: 0 West Trains: 0) ZUG1048 goes West. (East Trains: 0 West Trains: 1) ZUG1049 goes West. (East Trains: 0 West Trains: 2) ZUG1050 goes West. (East Trains: 0 West Trains: 3) ZUG1048 left West. (East Trains: 0 West Trains: 2) ZUG1049 left West. (East Trains: 0 West Trains: 1) ZUG1050 left West. (East Trains: 0 West Trains: 0) ZUG1052 goes West. (East Trains: 0 West Trains: 1) ZUG1053 goes West. (East Trains: 0 West Trains: 2) ZUG1055 goes West. (East Trains: 0 West Trains: 3) ZUG1052 left West. (East Trains: 0 West Trains: 2) ZUG1053 left West. (East Trains: 0 West Trains: 1) ZUG1055 left West. (East Trains: 0 West Trains: 0) ZUG1056 goes East. (East Trains: 1 West Trains: 0) ZUG1060 goes East. (East Trains: 2 West Trains: 0) ZUG1061 goes East. (East Trains: 3 West Trains: 0) ZUG1056 left East. (East Trains: 2 West Trains: 0) ZUG1060 left East. (East Trains: 1 West Trains: 0) ZUG1061 left East. (East Trains: 0 West Trains: 0) ZUG1057 goes West. (East Trains: 0 West Trains: 1) ZUG1058 goes West. (East Trains: 0 West Trains: 2) ZUG1059 goes West. (East Trains: 0 West Trains: 3) ZUG1057 left West. (East Trains: 0 West Trains: 2) ZUG1058 left West. (East Trains: 0 West Trains: 1) ZUG1059 left West. (East Trains: 0 West Trains: 0) ZUG1062 goes East. (East Trains: 1 West Trains: 0) ZUG1066 goes East. (East Trains: 2 West Trains: 0) ZUG1068 goes East. (East Trains: 3 West Trains: 0) ZUG1062 left East. (East Trains: 2 West Trains: 0) ZUG1066 left East. (East Trains: 1 West Trains: 0) ZUG1068 left East. (East Trains: 0 West Trains: 0) ZUG1064 goes West. (East Trains: 0 West Trains: 1) ZUG1067 goes West. (East Trains: 0 West Trains: 2) ZUG1069 goes West. (East Trains: 0 West Trains: 3) ZUG1064 left West. (East Trains: 0 West Trains: 2) ZUG1067 left West. (East Trains: 0 West Trains: 1) ZUG1069 left West. (East Trains: 0 West Trains: 0) ZUG1070 goes East. (East Trains: 1 West Trains: 0) ZUG1073 goes East. (East Trains: 2 West Trains: 0) ZUG1075 goes East. (East Trains: 3 West Trains: 0) ZUG1070 left East. (East Trains: 2 West Trains: 0) ZUG1073 left East. (East Trains: 1 West Trains: 0) ZUG1075 left East. (East Trains: 0 West Trains: 0) ZUG1071 goes West. (East Trains: 0 West Trains: 1) ZUG1072 goes West. (East Trains: 0 West Trains: 2) ZUG1074 goes West. (East Trains: 0 West Trains: 3) ZUG1071 left West. (East Trains: 0 West Trains: 2) ZUG1072 left West. (East Trains: 0 West Trains: 1) ZUG1074 left West. (East Trains: 0 West Trains: 0) ZUG1076 goes East. (East Trains: 1 West Trains: 0) ZUG1077 goes East. (East Trains: 2 West Trains: 0) ZUG1080 goes East. (East Trains: 3 West Trains: 0) ZUG1076 left East. (East Trains: 2 West Trains: 0) ZUG1077 left East. (East Trains: 1 West Trains: 0) ZUG1080 left East. (East Trains: 0 West Trains: 0) ZUG1078 goes West. (East Trains: 0 West Trains: 1) ZUG1079 goes West. (East Trains: 0 West Trains: 2) ZUG1081 goes West. (East Trains: 0 West Trains: 3) ZUG1078 left West. (East Trains: 0 West Trains: 2) ZUG1079 left West. (East Trains: 0 West Trains: 1) ZUG1081 left West. (East Trains: 0 West Trains: 0) ZUG1082 goes East. (East Trains: 1 West Trains: 0) ZUG1083 goes East. (East Trains: 2 West Trains: 0) ZUG1084 goes East. (East Trains: 3 West Trains: 0) ZUG1082 left East. (East Trains: 2 West Trains: 0) ZUG1083 left East. (East Trains: 1 West Trains: 0) ZUG1084 left East. (East Trains: 0 West Trains: 0) ZUG1085 goes East. (East Trains: 1 West Trains: 0) ZUG1086 goes East. (East Trains: 2 West Trains: 0) ZUG1087 goes East. (East Trains: 3 West Trains: 0) ZUG1085 left East. (East Trains: 2 West Trains: 0) ZUG1086 left East. (East Trains: 1 West Trains: 0) ZUG1087 left East. (East Trains: 0 West Trains: 0) ZUG1088 goes West. (East Trains: 0 West Trains: 1) ZUG1090 goes West. (East Trains: 0 West Trains: 2) ZUG1092 goes West. (East Trains: 0 West Trains: 3) ZUG1088 left West. (East Trains: 0 West Trains: 2) ZUG1090 left West. (East Trains: 0 West Trains: 1) ZUG1092 left West. (East Trains: 0 West Trains: 0) ZUG1089 goes East. (East Trains: 1 West Trains: 0) ZUG1091 goes East. (East Trains: 2 West Trains: 0) ZUG1093 goes East. (East Trains: 3 West Trains: 0) ZUG1089 left East. (East Trains: 2 West Trains: 0) ZUG1091 left East. (East Trains: 1 West Trains: 0) ZUG1093 left East. (East Trains: 0 West Trains: 0) ZUG1097 goes West. (East Trains: 0 West Trains: 1) ZUG1099 goes West. (East Trains: 0 West Trains: 2) ZUG1011 goes West. (East Trains: 0 West Trains: 3) ZUG1097 left West. (East Trains: 0 West Trains: 2) ZUG1099 left West. (East Trains: 0 West Trains: 1) ZUG1011 left West. (East Trains: 0 West Trains: 0) ZUG1098 goes East. (East Trains: 1 West Trains: 0) ZUG1012 goes East. (East Trains: 2 West Trains: 0) ZUG1002 goes East. (East Trains: 3 West Trains: 0) ZUG1098 left East. (East Trains: 2 West Trains: 0) ZUG1012 left East. (East Trains: 1 West Trains: 0) ZUG1002 left East. (East Trains: 0 West Trains: 0) ZUG1004 goes East. (East Trains: 1 West Trains: 0) ZUG1007 goes East. (East Trains: 2 West Trains: 0) ZUG1063 goes East. (East Trains: 3 West Trains: 0) ZUG1004 left East. (East Trains: 2 West Trains: 0) ZUG1007 left East. (East Trains: 1 West Trains: 0) ZUG1095 goes East. (East Trains: 2 West Trains: 0) ZUG1096 goes East. (East Trains: 3 West Trains: 0) ZUG1063 left East. (East Trains: 2 West Trains: 0) ZUG1008 goes East. (East Trains: 3 West Trains: 0) ZUG1095 left East. (East Trains: 2 West Trains: 0) ZUG1096 left East. (East Trains: 1 West Trains: 0) ZUG1013 goes East. (East Trains: 2 West Trains: 0) ZUG1008 left East. (East Trains: 1 West Trains: 0) ZUG1013 left East. (East Trains: 0 West Trains: 0) ZUG1094 goes West. (East Trains: 0 West Trains: 1) ZUG1094 left West. (East Trains: 0 West Trains: 0)