имеет проблемы с межпоточной связью и «решает» ее, используя «фиктивные сообщения» повсюду. Это плохая идея? Каковы возможные решения?Связь между потоками между производителями и потребителями
Пример Проблема у меня есть.
Основная тема начинает поток для обработки и вставки записей в базу данных. Основной поток читает возможно огромный файл и помещает одну запись (объект) за другой в блокирующий разряд. обрабатывает поток, читает из очереди и работает.
Как сказать «обрабатывая поток» для остановки? Очередь может быть пуста, но работа не выполняется, и основной поток не работает ни при завершении обработки потока, ни при его прерывании.
Так обработка резьбы делает
while (queue.size() > 0 || !Thread.currentThread().isInterrupted()) {
MyObject object= queue.poll(100, TimeUnit.MILLISECONDS);
if (object != null) {
String data = object.getData();
if (data.equals("END")) {
break;
}
// do work
}
}
// clean-up
synchronized queue) {
queue.notifyAll();
}
return;
и основной поток
// ...start processing thread...
while(reader.hasNext(){
// ...read whole file and put data in queue...
}
MyObject dummy = new MyObject();
dummy.setData("END");
queue.put(dummy);
//Note: empty queue here means work is done
while (queue.size() > 0) {
synchronized (queue) {
queue.wait(500); // over-cautios locking prevention i guess
}
}
Обратите внимание, что вставка должна быть в той же транзакции, и транзакция не может быть обработан по основной нити.
Что было бы лучшим способом сделать это? (Я учусь и не хочу начинать «делать это неправильно»)
Ok. Как я могу использовать это, если тип переданных объектов не имеет поля String, которое можно легко использовать для этого? Что, если какой-либо текст может быть достоверным и, следовательно, может равняться яду? Использовать GUID? –
В идеале вы должны изменить класс MyObject и добавить туда метод isPoison(). Как этот метод определяет, является ли объект ядом или нет, зависит от вас, может быть простой вещи, такой как сравнение, если сообщение пустое, пустое или если сообщение было явно создано как яд. Идея должна была бы реорганизовать MyObject как интерфейс с двумя реализациями, MessageObject, который всегда возвращает false в методе isPoison() и PoisonMessage, которые всегда возвращают true. Но это глубоко зависит от того, что именно вы делаете, и лучшие решения могут существовать с учетом вашего реального контекста. –