возникла проблема с межпотоковым взаимодействием и "решила" ее, повсюду используя "фиктивные сообщения". Это плохая идея? Каковы возможные решения?
Пример моей проблемы.
основной поток запускает поток для обработки и вставки записей в базу данных. основной поток читает возможно огромный файл и помещает одну запись (объект) за другой в очередь блокировки. поток обработки читает из очереди и работает.
Как мне сказать «потоку обработки» остановиться? Очередь может быть пустой, но работа не выполняется, и основной поток также не работает, когда поток обработки завершил работу и не может ее прервать.
Таким образом, поток обработки выполняет
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
}
}
. Обратите внимание, что вставка должна выполняться в той же транзакции, и транзакция не может быть обработана. по основному потоку.
Что было бы лучше сделать? (Я учусь и не хочу начинать «делать это неправильно»)