Skip to content

Commit 42a037c

Browse files
authored
The grace of our Lord Jesus Christ be with you all
The grace of our Lord Jesus Christ be with you all. Amen. (Revelation 22:21)
1 parent 848a6e7 commit 42a037c

1 file changed

Lines changed: 120 additions & 0 deletions

File tree

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
2+
//The grace of our Lord Jesus Christ be with you all. Amen. (Revelation 22:21)
3+
4+
package com.javarush.task.task29.task2905;
5+
6+
import java.util.ArrayList;
7+
import java.util.Collection;
8+
import java.util.concurrent.BlockingQueue;
9+
import java.util.concurrent.LinkedBlockingQueue;
10+
import java.util.logging.Level;
11+
import java.util.logging.Logger;
12+
13+
/*
14+
Странные ошибки О_о
15+
*/
16+
public class Solution {
17+
final int NUMBER_OF_THREADS = 3; //3 треда будет обрабатывать нашу очередь
18+
final int MAX_BATCH_SIZE = 100; //будем вытаскивать по 100 сообщений
19+
20+
private Logger logger = Logger.getLogger(Solution.class.getName());
21+
private BlockingQueue messageQueue = new LinkedBlockingQueue();//тут будут храниться все сообщения
22+
23+
private BlockingQueue fakeDataBase = new LinkedBlockingQueue();
24+
25+
public static void main(String[] args) throws InterruptedException {
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+
new Thread() {
48+
@Override
49+
public void run() {
50+
for (int i = 0; i < 100000; i++) {
51+
messageQueue.add(String.valueOf(i));
52+
}
53+
}
54+
}.start();
55+
}
56+
57+
public void startMessagePersisting() {
58+
for (int i = 0; i < NUMBER_OF_THREADS; i++) {
59+
new Thread() {
60+
private final Collection batch = new ArrayList(MAX_BATCH_SIZE);
61+
62+
{
63+
setDaemon(true);
64+
}
65+
66+
@Override
67+
public void run() {
68+
while (true) {
69+
try {
70+
messageQueue.drainTo(batch, MAX_BATCH_SIZE);
71+
persistData(batch);
72+
batch.clear();
73+
Thread.sleep(1);
74+
} catch (Throwable e) {
75+
logger.log(Level.SEVERE, "impossible to persist a batch", e);
76+
}
77+
}
78+
}
79+
}.start();
80+
}
81+
}
82+
83+
private void persistData(Collection batch) {
84+
//представим, что тут мы коннектимся к базе данных, и сохраняем данные в нее
85+
//сохранение данных по 1 записи тратит много ресурсов, поэтому делают батчем (группой по несколько)
86+
fakeDataBase.addAll(batch);
87+
}
88+
89+
private void printResults() {
90+
System.out.println();
91+
System.out.println("messageQueue size is " + messageQueue.size());
92+
System.out.println("fakeDataBase size is " + fakeDataBase.size());
93+
}
94+
}
95+
96+
/*
97+
Странные ошибки О_о
98+
99+
Исправь 2 ошибки:
100+
101+
1) возникновение исключения
102+
103+
2) подвисание
104+
105+
Сделай минимальные изменения.
106+
107+
108+
109+
110+
111+
Требования:
112+
113+
1. Метод startMessageCreating должен без зависаний добавлять в messageQueue 100000 элементов.
114+
115+
2. Исправь ошибку в строке "messageQueue.drainTo(messageQueue, MAX_BATCH_SIZE);".
116+
117+
3. Метод main не должен зависать.
118+
119+
4. Вывод программы должен показывать, что все сообщения из messageQueue были перенесены в fakeDataBase.
120+
*/

0 commit comments

Comments
 (0)