Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Threading;
- public class Program
- {
- public static void Main()
- {
- const int ANZAHL = 8;
- Lager l = new Lager();
- Random random = new Random();
- Thread[] producer = new Thread[3];
- for (int i = 0; i <= ANZAHL; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- producer[j] = new Thread(l.Produzieren);
- producer[j].Start(random.Next(100)+1);
- }
- Thread consumer = new Thread(l.Entnehmen);
- consumer.Start(random.Next(100) + 1);
- }
- }
- }
- public class Lager
- {
- private int bestand = 70;
- const int MAX_BESTAND = 120;
- private readonly object locker = new object();
- const int MAX_VERSUCHE = 10;
- public Boolean abbruch(int versuche)
- {
- if (versuche == MAX_VERSUCHE)
- {
- Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " gibt auf. Zu viele Versuche.");
- return true;
- }
- return false;
- }
- public void Produzieren(object obj)
- {
- int versuche = 0;
- int prod=0;
- try
- {
- prod = (int)obj;
- }
- catch (InvalidCastException)
- {
- Console.WriteLine("InvalidCastException");
- return;
- }
- while (true)
- {
- if (abbruch(versuche))
- return;
- lock (locker)
- {
- if (bestand + prod > MAX_BESTAND)
- {
- versuche++;
- Console.WriteLine(Thread.CurrentThread.ManagedThreadId+" will zu viel abgeben. Bestand "+ bestand+". Gewünschte Abgabe: "+prod+". Max: "+ MAX_BESTAND);
- Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " legt sich schlafen!");
- Thread.Sleep(1000);
- continue;
- }
- versuche += 1;
- bestand += prod;
- Console.WriteLine("Thread "+ Thread.CurrentThread.ManagedThreadId + " hat " + prod + " Einheiten produziert.");
- Console.WriteLine("Bestand: " + bestand);
- Console.WriteLine(Thread.CurrentThread.ManagedThreadId+" terminiert");
- return;
- }
- }
- }
- public void Entnehmen(object obj)
- {
- int versuche = 0;
- int prod = 0;
- try
- {
- prod = (int)obj;
- }
- catch (InvalidCastException)
- {
- Console.WriteLine("InvalidCastException");
- return;
- }
- while (true)
- {
- lock (locker)
- {
- if (bestand-prod < 1)
- {
- if (versuche==MAX_VERSUCHE)
- {
- Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " gibt auf. Zu viele Versuche.");
- return;
- }
- versuche++;
- Console.WriteLine("Zu wenig");
- Console.WriteLine("Bestand: " + bestand);
- Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " legt sich schlafen!");
- Thread.Sleep(1000);
- continue;
- }
- bestand -= prod;
- Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " hat " + prod + " Einheiten genommern.");
- Console.WriteLine("Bestand: " + bestand);
- Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " terminiert");
- return;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement