Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > совет по многопоточности и синхронизации


Автор: LeMoH 9.1.2011, 23:28
Доброго времени суток.
Есть класс (LogParser) который реализует парсинг больших текстовых файлов ~100мб, он выполнен в виде отдельного потока, и есть класс (DataBaseConnector) который добавляет разпарсеные записи в бд

В случае когда набирается достаточное количество записей в листе structures, я создаю новый поток в лице DataBaseConnector-а, передаю ему этот лист, и декрементирую переменную DBThreads, которую я считаю счётчиком "свободных" потоков
LogParser
Код

public class LogParser implements Runnable{
    ...
    public static Short DBThreads=10;
    private short numOfCorts = 50;
    private ArrayList<DataStructure> structures;
    ...
    ...
        if(counter++==numOfCorts) {
            try {
                synchronized (LogParser.DBThreads) {
                    while(LogParser.DBThreads<1) {
                        System.out.println("sleep; dbThread - "+LogParser.DBThreads);
                        LogParser.DBThreads.wait(2000);
                    }
                    LogParser.DBThreads--;
                    new DataBaseConnector(structures).start();
                }
            }
            catch(Exception ex) {
                System.out.println("thread trouble - "+ex.getMessage());
            }
            counter=0;
            structures.clear();
        }
    ...
}


в основном потоке DataBaseConnector-а как видно я вызываю метод который добавляет записи в бд и инкрементирует счётчик "свободных" потоков
DataBaseConnector
Код

public class DataBaseConnector extends Thread{
    ...
    ...
    public void run() {
        addLogs();
        synchronized (LogParser.DBThreads) {
            LogParser.DBThreads++;
        }
    }
}


Собственно вопрос вот в чём, при попытке использовать wait() без параметра, и вызывать в DataBaseConnector-е в synchronized блоке LogParser.DBThreads.notify() вываливались ексепшены "java.lang.IllegalMonitorStateException", у меня такое чувство что я чего то непонимаю, поэтому был бы благодарен за объяснение происходящего.

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

Автор: shorewall 10.1.2011, 12:00
DBThreads - экземпляр класса-оболочки над примитивным типом short.

Код

synchronized (LogParser.DBThreads) {
    LogParser.DBThreads++; // создается новый объект-оболочка Short, который и сохраняется в DBThreads, который уже не находится 
                          // в критической секции и по-этому на нем нельзя вызывать метод notify() => java.lang.IllegalMonitorStateException
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)