powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск потоков в конструкторе класса
25 сообщений из 27, страница 1 из 2
Запуск потоков в конструкторе класса
    #39828669
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Является ли хорошей практикой запускать потоки в конструкторе класса?:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public class MessageServiceQueueListener<T> implements MessageListener {
    
    private final int flushDBTimer;  
    private List<T> objectList;
    private ScheduledExecutorService executorFlushSchedule;

    public MessageServiceQueueListener(
            int flushDBTimer,
            ScheduledExecutorService executorFlushSchedule) {
        this.flushDBTimer = flushDBTimer;
        this.objectList = new ArrayList<>();
        this.executorFlushSchedule = executorFlushSchedule;
        
        this.executorFlushSchedule.scheduleAtFixedRate(
                    () -> {
                        if (objectList.size() > 0) {
                            ...
                        }
                    },
                    0,
                    flushDBTimer,
                    TimeUnit.SECONDS);
    }
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828671
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы рассмотрел ситуацию когда внутри потока (конструктора) бросается RuntimeException и мы выпадаем из конструктора.
При этом объект как будто-бы не создан. Тоесть у нас нет данных для анализа.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828675
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasarпотоки в конструкторе класса-1
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828677
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Molasar, а если не нужно запускать тред сразу, а потом?
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828685
kolchanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.javapractices.com/topic/TopicAction.do?Id=254

There's nothing wrong with creating a thread object in a constructor or static initializer - just don't start it there.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828688
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsyklopMolasar, а если не нужно запускать тред сразу, а потом?
Как раз и нужно запустить поток один раз и сразу.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828689
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarTsyklopMolasar, а если не нужно запускать тред сразу, а потом?
Как раз и нужно запустить поток один раз и сразу.выше уровнем код покажи. Наверно и там можно "один раз и сразу"
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828691
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. Всем спасибо.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828738
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше не стоит. Ни создавать ни стартовать. И вообще лучше переходить к многопточном коду только после прочтения хотя бы Java Concurrency in Practice, а еще лучше JCIP + Art of Multiprocessor programming
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828814
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39828817
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?

всмысле, не exception, а некорректную цифру.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829044
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?
Уже повалились)))
Использую synchronized(Object) {...}
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829049
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинОзверинMolasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?

всмысле, не exception, а некорректную цифру.
exception были проблемой.
eventList.isEmpty() - потокобезопасная операция?
Мне важно определить есть ли в списке элементы или нет.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829058
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarОзверинпропущено...


всмысле, не exception, а некорректную цифру.
exception были проблемой.
eventList.isEmpty() - потокобезопасная операция?
Мне важно определить есть ли в списке элементы или нет.

вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829060
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarОзверинпропущено...


всмысле, не exception, а некорректную цифру.
exception были проблемой.
eventList.isEmpty() - потокобезопасная операция?
Мне важно определить есть ли в списке элементы или нет.

If we look inside the isEmpty() method, it also check the size of arraylist to determine if the list is empty or not.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829064
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй обернуть список такой оберткой

Код: java
1.
Collections.synchronizedList(...)



Но после этого надо мерять производительность. Т.к. если ты будешь сильно часто "долбить" по такому списку
из множества потоков то синхронизирующая обёртка может стать узким местом. И посмотри в API примеры
как его использовать.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829067
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasarпропущено...

exception были проблемой.
eventList.isEmpty() - потокобезопасная операция?
Мне важно определить есть ли в списке элементы или нет.

вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)
Через пул хикари получается 5к-10к сообщений в секунду.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829069
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasarпропущено...

exception были проблемой.
eventList.isEmpty() - потокобезопасная операция?
Мне важно определить есть ли в списке элементы или нет.

вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)
В итоге вся эта связка с ActiveMQ получается очень надежной и быстрой.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829070
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarОзверинпропущено...


вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)
Через пул хикари получается 5к-10к сообщений в секунду.
Пул ускоряет только операцию создания нового коннекта. Если ты решаешь задачи где требуется
постояное и долго-живущее соединение (обслуживание очереди) то я-бы создал просто отдельный
объект Connection навечно. При ошибках - соотв надо предусмотреть логику реконнекта.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829071
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПопробуй обернуть список такой оберткой

Код: java
1.
Collections.synchronizedList(...)



Но после этого надо мерять производительность. Т.к. если ты будешь сильно часто "долбить" по такому списку
из множества потоков то синхронизирующая обёртка может стать узким местом. И посмотри в API примеры
как его использовать.
А Queue быстрее List будет или нет при частом добавлении, чтении?
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829076
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMolasarпропущено...

Через пул хикари получается 5к-10к сообщений в секунду.
Пул ускоряет только операцию создания нового коннекта. Если ты решаешь задачи где требуется
постояное и долго-живущее соединение (обслуживание очереди) то я-бы создал просто отдельный
объект Connection навечно. При ошибках - соотв надо предусмотреть логику реконнекта.
Пока взял готовое решение - Хикари, чтобы использовать создаваемые им соединения в отдельных потоках.
При кол-ве потоков = 2*CPU_cores + 1 получается самый производительный вариант записи в БД. Меньше или больше производительность снижается. Где-то у Oracle это прочел, на практике подтвердилось.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829081
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarmaytonПопробуй обернуть список такой оберткой

Код: java
1.
Collections.synchronizedList(...)



Но после этого надо мерять производительность. Т.к. если ты будешь сильно часто "долбить" по такому списку
из множества потоков то синхронизирующая обёртка может стать узким местом. И посмотри в API примеры
как его использовать.
А Queue быстрее List будет или нет при частом добавлении, чтении?
Queue будет быстрее только в особых случаях. Когда у тебя в задаче есть ярко-выраженная операция с очередями.
Такая как добавить в хвост. И взять с головы . И есть 2 (и более потоков) которые это делают асинхронно
и независимо. В остальных случаях Queue может быть хуже чем List.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829090
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molasar, я так думаю, что самый просто и надежный вариант и при этом приемлемый по скорости - это использовать ArrayBlockingQueue
и не париться. Если скорость не устроит - идти дальше.
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829094
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMolasarпропущено...

А Queue быстрее List будет или нет при частом добавлении, чтении?
Queue будет быстрее только в особых случаях. Когда у тебя в задаче есть ярко-выраженная операция с очередями.
Такая как добавить в хвост. И взять с головы . И есть 2 (и более потоков) которые это делают асинхронно
и независимо. В остальных случаях Queue может быть хуже чем List.
В моём случае будет 2 потока:
1-ый добавляет элемент в хвост.
2-ой берет и удаляет элемент с головы.
Озверин тоже рекомендовал использовать - ArrayBlockingQueue
...
Рейтинг: 0 / 0
Запуск потоков в конструкторе класса
    #39829095
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинMolasar, я так думаю, что самый просто и надежный вариант и при этом приемлемый по скорости - это использовать ArrayBlockingQueue
и не париться. Если скорость не устроит - идти дальше.
Понял. Спасибо
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск потоков в конструкторе класса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]