Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.javarush.task.task29.task2905;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.concurrent.BlockingQueue;
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- /*
- Странные ошибки О_о
- */
- public class Solution
- {
- final int NUMBER_OF_THREADS = 3; //3 треда будет обрабатывать нашу очередь
- final int MAX_BATCH_SIZE = 100; //будем вытаскивать по 100 сообщений
- private Logger logger = Logger.getLogger (Solution.class.getName ( ));
- private BlockingQueue messageQueue = new LinkedBlockingQueue ( );//тут будут храниться все сообщения
- private BlockingQueue fakeDataBase = new LinkedBlockingQueue ( );
- public static void main(String[] args) throws InterruptedException
- {
- // статики во многих местах неуместны, поэтому помещаем все данные в поля класса,
- // затем создаем объект и вызываем его метод
- Solution solution = new Solution ( );
- solution.startMessageCreating ( );
- solution.startMessagePersisting ( );
- Thread.sleep (100);
- solution.printResults ( );
- Thread.sleep (100);
- solution.printResults ( );
- Thread.sleep (100);
- solution.printResults ( );
- Thread.sleep (500);
- solution.printResults ( );
- }
- public void startMessageCreating()
- {
- new Thread ( )
- {
- @Override
- public void run()
- {
- for (int i = 0; i < 100000; i++)
- {
- messageQueue.add (String.valueOf (i));//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- }
- }
- }.start ( );
- }
- public void startMessagePersisting()
- {
- for (int i = 0; i < NUMBER_OF_THREADS; i++)
- {
- new Thread ( )
- {
- private final Collection batch = new ArrayList (MAX_BATCH_SIZE);
- {
- setDaemon (true);
- }
- @Override
- public void run()
- {
- while (true)
- {
- try
- {
- messageQueue.drainTo (batch, MAX_BATCH_SIZE);//!!!!!!!!!!!!!!!!!!!!!!
- persistData (batch);
- batch.clear ( );
- Thread.sleep (1);
- }
- catch (Throwable e)
- {
- logger.log (Level.SEVERE, "impossible to persist a batch", e);
- }
- }
- }
- }.start ( );
- }
- }
- private void persistData(Collection batch)
- {
- //представим, что тут мы коннектимся к базе данных, и сохраняем данные в нее
- //сохранение данных по 1 записи тратит много ресурсов, поэтому делают батчем (группой по несколько)
- fakeDataBase.addAll (batch);
- }
- private void printResults()
- {
- System.out.println ( );
- System.out.println ("messageQueue size is " + messageQueue.size ( ));
- System.out.println ("fakeDataBase size is " + fakeDataBase.size ( ));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement