Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> совет по многопоточности и синхронизации, прокоментируйте пожалуйста код 
:(
    Опции темы
LeMoH
Дата 9.1.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 7.8.2008

Репутация: нет
Всего: нет



Доброго времени суток.
Есть класс (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. ну и впринципе хотелось бы услышать мнение о таком подходе, возможно какие то замечания или советы
PM MAIL   Вверх
shorewall
Дата 10.1.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



DBThreads - экземпляр класса-оболочки над примитивным типом short.

Код

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0972 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.