Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. package com.javarush.task.task29.task2905;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.concurrent.BlockingQueue;
  6. import java.util.concurrent.LinkedBlockingQueue;
  7. import java.util.logging.Level;
  8. import java.util.logging.Logger;
  9.  
  10. /*
  11. Странные ошибки О_о
  12. */
  13.  
  14. public class Solution
  15. {
  16. final int NUMBER_OF_THREADS = 3; //3 треда будет обрабатывать нашу очередь
  17. final int MAX_BATCH_SIZE = 100; //будем вытаскивать по 100 сообщений
  18.  
  19. private Logger logger = Logger.getLogger (Solution.class.getName ( ));
  20. private BlockingQueue messageQueue = new LinkedBlockingQueue ( );//тут будут храниться все сообщения
  21.  
  22. private BlockingQueue fakeDataBase = new LinkedBlockingQueue ( );
  23.  
  24. public static void main(String[] args) throws InterruptedException
  25. {
  26. // статики во многих местах неуместны, поэтому помещаем все данные в поля класса,
  27. // затем создаем объект и вызываем его метод
  28. Solution solution = new Solution ( );
  29.  
  30. solution.startMessageCreating ( );
  31. solution.startMessagePersisting ( );
  32.  
  33. Thread.sleep (100);
  34. solution.printResults ( );
  35.  
  36. Thread.sleep (100);
  37. solution.printResults ( );
  38.  
  39. Thread.sleep (100);
  40. solution.printResults ( );
  41.  
  42. Thread.sleep (500);
  43. solution.printResults ( );
  44. }
  45.  
  46. public void startMessageCreating()
  47. {
  48. new Thread ( )
  49. {
  50. @Override
  51. public void run()
  52. {
  53. for (int i = 0; i < 100000; i++)
  54. {
  55. messageQueue.add (String.valueOf (i));//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  56. }
  57. }
  58. }.start ( );
  59. }
  60.  
  61. public void startMessagePersisting()
  62. {
  63. for (int i = 0; i < NUMBER_OF_THREADS; i++)
  64. {
  65. new Thread ( )
  66. {
  67. private final Collection batch = new ArrayList (MAX_BATCH_SIZE);
  68. {
  69. setDaemon (true);
  70. }
  71. @Override
  72. public void run()
  73. {
  74. while (true)
  75. {
  76. try
  77. {
  78. messageQueue.drainTo (batch, MAX_BATCH_SIZE);//!!!!!!!!!!!!!!!!!!!!!!
  79. persistData (batch);
  80. batch.clear ( );
  81. Thread.sleep (1);
  82. }
  83. catch (Throwable e)
  84. {
  85. logger.log (Level.SEVERE, "impossible to persist a batch", e);
  86. }
  87. }
  88. }
  89. }.start ( );
  90. }
  91. }
  92. private void persistData(Collection batch)
  93. {
  94. //представим, что тут мы коннектимся к базе данных, и сохраняем данные в нее
  95. //сохранение данных по 1 записи тратит много ресурсов, поэтому делают батчем (группой по несколько)
  96. fakeDataBase.addAll (batch);
  97. }
  98. private void printResults()
  99. {
  100. System.out.println ( );
  101. System.out.println ("messageQueue size is " + messageQueue.size ( ));
  102. System.out.println ("fakeDataBase size is " + fakeDataBase.size ( ));
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement