Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. package week2;
  2.  
  3. import java.util.Random;
  4. import java.util.stream.IntStream;
  5.  
  6. public class Week2 {
  7.  
  8. public static void main(String[] args) throws InterruptedException {
  9. System.out.println("Starting");
  10.  
  11. Data data = new Data();
  12.  
  13. Thread t1 = new Thread(new NumberProducer(data, 1, 50), "Generator_1_50");
  14. Thread t2 = new Thread(new NumberProducer(data, 100, 500), "Generator_100_500");
  15. Thread t3 = new Thread(new NumberConsumer(data), "NumberConsumer");
  16. Thread t4 = new Thread(new MyLogger(data, t1, t2, t3), "Logger");
  17. t4.setDaemon(true);
  18.  
  19. t1.start();
  20. t2.start();
  21. t3.start();
  22. t4.start();
  23.  
  24. Thread.sleep(30_000);
  25.  
  26. t1.interrupt();
  27. t2.interrupt();
  28. t3.interrupt();
  29.  
  30. System.out.println("Done");
  31. }
  32.  
  33. static class Data {
  34. private volatile Integer number = null;
  35.  
  36. public Integer getNumber(){
  37. return number;
  38. }
  39.  
  40. public synchronized Integer read() throws InterruptedException {
  41. while (number == null) {
  42. wait();
  43. }
  44.  
  45. var tmp = number;
  46. number = null;
  47. notifyAll();
  48.  
  49. return tmp;
  50. }
  51.  
  52. public synchronized void write(Integer number) throws InterruptedException {
  53. while (this.number != null) {
  54. wait();
  55. }
  56.  
  57. this.number = number;
  58. notifyAll();
  59. }
  60. }
  61.  
  62. static class NumberProducer implements Runnable {
  63. private Data data;
  64. private Integer lowerBound;
  65. private Integer upperBound;
  66. private Random random;
  67.  
  68. public NumberProducer(Data data, Integer lowerBound, Integer upperBound) {
  69. this.data = data;
  70. this.lowerBound = lowerBound;
  71. this.upperBound = upperBound;
  72. random = new Random();
  73. }
  74.  
  75. @Override
  76. public void run() {
  77. try {
  78. while (true) {
  79. var number = random.nextInt(upperBound - lowerBound) + lowerBound + 1;
  80. data.write(number);
  81. }
  82. } catch (InterruptedException e) {
  83. System.err.println("[" + Thread.currentThread().getName() + "] interrupted");
  84. Thread.currentThread().interrupt();
  85. }
  86. }
  87. }
  88.  
  89. static class NumberConsumer implements Runnable {
  90.  
  91. private Data data;
  92.  
  93. public NumberConsumer(Data data) {
  94. this.data = data;
  95. }
  96.  
  97. @Override
  98. public void run() {
  99. try {
  100. while (true) {
  101. var number = data.read();
  102. System.out.println("[" + Thread.currentThread().getName() + "] - " + IntStream.rangeClosed(1, number).sum());
  103. Thread.sleep(1_000);
  104. }
  105. } catch (InterruptedException e) {
  106. System.err.println("[" + Thread.currentThread().getName() + "] interrupted");
  107. Thread.currentThread().interrupt();
  108. }
  109. }
  110. }
  111.  
  112. static class MyLogger implements Runnable {
  113.  
  114. private Data data;
  115. private Thread[] threads;
  116.  
  117. public MyLogger(Data data, Thread... threads) {
  118. this.data = data;
  119. this.threads = threads;
  120. }
  121.  
  122. @Override
  123. public void run() {
  124. try {
  125. while (true) {
  126. System.out.println("Number: " + data.getNumber());
  127. for (var thread : threads) {
  128. System.out.println("[" + thread.getName() + "] " + thread.getState());
  129. }
  130. System.out.println("===================");
  131. Thread.sleep(1_000);
  132. }
  133. } catch (InterruptedException e) {
  134. throw new IllegalStateException(e);
  135. }
  136. }
  137. }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement