При межпотоковом взаимодействии между производителем и потребителем

возникла проблема с межпотоковым взаимодействием и "решила" ее, повсюду используя "фиктивные сообщения". Это плохая идея? Каковы возможные решения?

Пример моей проблемы.

основной поток запускает поток для обработки и вставки записей в базу данных. основной поток читает возможно огромный файл и помещает одну запись (объект) за другой в очередь блокировки. поток обработки читает из очереди и работает.

Как мне сказать «потоку обработки» остановиться? Очередь может быть пустой, но работа не выполняется, и основной поток также не работает, когда поток обработки завершил работу и не может ее прервать.

Таким образом, поток обработки выполняет

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
    }
}

. Обратите внимание, что вставка должна выполняться в той же транзакции, и транзакция не может быть обработана. по основному потоку.

Что было бы лучше сделать? (Я учусь и не хочу начинать «делать это неправильно»)

6
задан svick 15 June 2012 в 17:40
поделиться