Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.79 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. public class Program
  5. {
  6. public static void Main()
  7. {
  8. const int ANZAHL = 8;
  9. Lager l = new Lager();
  10. Random random = new Random();
  11. Thread[] producer = new Thread[3];
  12.  
  13.  
  14.  
  15. for (int i = 0; i <= ANZAHL; i++)
  16. {
  17. for (int j = 0; j < 3; j++)
  18. {
  19. producer[j] = new Thread(l.Produzieren);
  20. producer[j].Start(random.Next(100)+1);
  21. }
  22. Thread consumer = new Thread(l.Entnehmen);
  23. consumer.Start(random.Next(100) + 1);
  24.  
  25.  
  26. }
  27. }
  28. }
  29.  
  30.  
  31. public class Lager
  32. {
  33. private int bestand = 70;
  34. const int MAX_BESTAND = 120;
  35. private readonly object locker = new object();
  36. const int MAX_VERSUCHE = 10;
  37.  
  38. public Boolean abbruch(int versuche)
  39. {
  40. if (versuche == MAX_VERSUCHE)
  41. {
  42. Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " gibt auf. Zu viele Versuche.");
  43. return true;
  44. }
  45. return false;
  46. }
  47.  
  48. public void Produzieren(object obj)
  49. {
  50. int versuche = 0;
  51. int prod=0;
  52. try
  53. {
  54. prod = (int)obj;
  55. }
  56. catch (InvalidCastException)
  57. {
  58. Console.WriteLine("InvalidCastException");
  59. return;
  60. }
  61. while (true)
  62. {
  63. if (abbruch(versuche))
  64. return;
  65. lock (locker)
  66. {
  67.  
  68. if (bestand + prod > MAX_BESTAND)
  69. {
  70. versuche++;
  71. Console.WriteLine(Thread.CurrentThread.ManagedThreadId+" will zu viel abgeben. Bestand "+ bestand+". Gewünschte Abgabe: "+prod+". Max: "+ MAX_BESTAND);
  72. Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " legt sich schlafen!");
  73. Thread.Sleep(1000);
  74. continue;
  75. }
  76. versuche += 1;
  77. bestand += prod;
  78. Console.WriteLine("Thread "+ Thread.CurrentThread.ManagedThreadId + " hat " + prod + " Einheiten produziert.");
  79. Console.WriteLine("Bestand: " + bestand);
  80. Console.WriteLine(Thread.CurrentThread.ManagedThreadId+" terminiert");
  81. return;
  82. }
  83. }
  84. }
  85.  
  86.  
  87. public void Entnehmen(object obj)
  88. {
  89. int versuche = 0;
  90. int prod = 0;
  91. try
  92. {
  93. prod = (int)obj;
  94. }
  95. catch (InvalidCastException)
  96. {
  97. Console.WriteLine("InvalidCastException");
  98. return;
  99. }
  100. while (true)
  101. {
  102. lock (locker)
  103. {
  104. if (bestand-prod < 1)
  105. {
  106. if (versuche==MAX_VERSUCHE)
  107. {
  108. Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " gibt auf. Zu viele Versuche.");
  109. return;
  110. }
  111. versuche++;
  112. Console.WriteLine("Zu wenig");
  113. Console.WriteLine("Bestand: " + bestand);
  114. Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " legt sich schlafen!");
  115. Thread.Sleep(1000);
  116. continue;
  117. }
  118. bestand -= prod;
  119. Console.WriteLine("Thread " + Thread.CurrentThread.ManagedThreadId + " hat " + prod + " Einheiten genommern.");
  120. Console.WriteLine("Bestand: " + bestand);
  121. Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " terminiert");
  122. return;
  123. }
  124.  
  125. }
  126.  
  127. }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement