Несколько потоков в Java вызывают проблемы

Извините за еще один расплывчатый пример... но у меня есть один класс, в котором я запускаю новый экземпляр потока. Однако, если я добавляю новый экземпляр потока, он прерывает (уничтожает?) первый.

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

Я убежден, что ошибка заключается в том, как я реализую многопоточность.

Любые предложения для вещей, чтобы искать? Спасибо! Извините за нечеткий пример.


person Monster    schedule 06.08.2009    source источник
comment
Итак, поскольку вы дважды извинились за расплывчатость, вы не можете предоставить образец кода?   -  person Sean Bright    schedule 07.08.2009
comment
Монстр. Во избежание расплывчатых вопросов обычно полезно создать самый упрощенный пример кода, который создает проблему, с которой вы пытаетесь справиться. Публикация такого примера, вероятно, является самым быстрым способом, которым кто-то может определить, где вы ошибаетесь, и предложить альтернативный подход.   -  person Spencer Ruport    schedule 07.08.2009
comment
Я убежден, что ошибка заключается в том, как вы реализуете многопоточность. Чтобы исправить это, вы должны повторно реализовать его правильно. Я прошу прощения за то, что так расплывчато о том, как это исправить, однако.   -  person Jason Coco    schedule 07.08.2009


Ответы (2)


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

Авторы класса должны четко указывать потокобезопасность своих классов, но очень часто они этого не делают. Учитывая, что такие среды, как сервлеты, могут быть изначально многопоточными, это может стать реальной проблемой.

Вам нужно изучить класс и выяснить, какие методы, если таковые имеются, являются потокобезопасными. Возможно, в классе InstanceOfClassIDontControl есть статические переменные, которые путаются при многопоточном доступе. Если вы не только не контролируете класс, но даже не видите его исходный код, вам понадобится поддержка владельцев.

person djna    schedule 06.08.2009

Хорошо, вот пример:

public class driver {

    public static void main(String args[])
    {
        Thread x;
        Thread y;

        x = new Thread(new pow());
        y = new Thread(new pow());

        x.start();
        y.start();  
    }
}

public class pow extends Thread {

    public void run() {
        InstanceOfClassIDontControl a = new InstanceOfClassIDontControl();
                a.doVariousProcesses();
    }
}

В примере я (очевидно) не управляю классом, экземпляр которого создается и вызывается в потоке. Каждый поток может работать в течение нескольких минут. Но всякий раз, когда запускается параллельный поток (в данном случае с y.start()), он уничтожает действия объекта, вызываемого в экземпляре run() функции x.start().

person Monster    schedule 06.08.2009
comment
Похоже, что InstanceOfClassIDontControl не является потокобезопасным и использует глобальные статические структуры данных. Я бы проверил документацию InstanceOfClassIDontControl. - person Jason Coco; 07.08.2009
comment
Но нет ли простого способа инкапсулировать его сам по себе? Я могу запускать столько экземпляров, сколько захочу, если они находятся в разных работающих банках. - person Monster; 07.08.2009
comment
Объекты не запускаются в банках. В обычной Java при загрузке класса выполняется поиск всех банок в пути к классам и загружается первое определение класса. Дублирование класса во многих банках ничего не изменит. Вероятный ответ - предоставить потокобезопасную оболочку вокруг не потокобезопасного класса. - person djna; 07.08.2009