Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Всем привет!

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

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);
    }
20 июн 19, 10:08    [21912032]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Я-бы рассмотрел ситуацию когда внутри потока (конструктора) бросается RuntimeException и мы выпадаем из конструктора.
При этом объект как будто-бы не создан. Тоесть у нас нет данных для анализа.
20 июн 19, 10:21    [21912037]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Molasar
потоки в конструкторе класса
-1
20 июн 19, 10:30    [21912044]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 1069
Molasar, а если не нужно запускать тред сразу, а потом?
20 июн 19, 10:34    [21912047]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
kolchanov
Member

Откуда: Питер
Сообщений: 180
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.
20 июн 19, 10:42    [21912055]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Tsyklop
Molasar, а если не нужно запускать тред сразу, а потом?

Как раз и нужно запустить поток один раз и сразу.
20 июн 19, 10:47    [21912060]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2443
Molasar
Tsyklop
Molasar, а если не нужно запускать тред сразу, а потом?

Как раз и нужно запустить поток один раз и сразу.
выше уровнем код покажи. Наверно и там можно "один раз и сразу"
20 июн 19, 10:49    [21912061]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Понял. Всем спасибо.
20 июн 19, 10:50    [21912063]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
забыл ник
Member

Откуда:
Сообщений: 3038
Лучше не стоит. Ни создавать ни стартовать. И вообще лучше переходить к многопточном коду только после прочтения хотя бы Java Concurrency in Practice, а еще лучше JCIP + Art of Multiprocessor programming
20 июн 19, 12:35    [21912137]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Molasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?
20 июн 19, 14:58    [21912277]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин
Molasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?


всмысле, не exception, а некорректную цифру.
20 июн 19, 15:04    [21912282]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Озверин
Molasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?

Уже повалились)))
Использую synchronized(Object) {...}
21 июн 19, 09:54    [21912672]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Озверин
Озверин
Molasar, вас не смущает , что size() - не потокобезопасная операция и может exception вывалиться?


всмысле, не exception, а некорректную цифру.

exception были проблемой.
eventList.isEmpty() - потокобезопасная операция?
Мне важно определить есть ли в списке элементы или нет.
21 июн 19, 09:58    [21912677]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Molasar
Озверин
пропущено...


всмысле, не exception, а некорректную цифру.

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


вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)
21 июн 19, 10:12    [21912699]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
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.
21 июн 19, 10:13    [21912701]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Попробуй обернуть список такой оберткой

Collections.synchronizedList(...)


Но после этого надо мерять производительность. Т.к. если ты будешь сильно часто "долбить" по такому списку
из множества потоков то синхронизирующая обёртка может стать узким местом. И посмотри в API примеры
как его использовать.
21 июн 19, 10:15    [21912706]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Озверин
Molasar
пропущено...

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


вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)

Через пул хикари получается 5к-10к сообщений в секунду.
21 июн 19, 10:22    [21912709]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Озверин
Molasar
пропущено...

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


вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)

В итоге вся эта связка с ActiveMQ получается очень надежной и быстрой.
21 июн 19, 10:26    [21912712]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Molasar
Озверин
пропущено...


вы в итоге делаете это для того, чтобы по 1000 сообщений вставлять в БД?:)

Через пул хикари получается 5к-10к сообщений в секунду.

Пул ускоряет только операцию создания нового коннекта. Если ты решаешь задачи где требуется
постояное и долго-живущее соединение (обслуживание очереди) то я-бы создал просто отдельный
объект Connection навечно. При ошибках - соотв надо предусмотреть логику реконнекта.
21 июн 19, 10:28    [21912714]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
mayton
Попробуй обернуть список такой оберткой

Collections.synchronizedList(...)


Но после этого надо мерять производительность. Т.к. если ты будешь сильно часто "долбить" по такому списку
из множества потоков то синхронизирующая обёртка может стать узким местом. И посмотри в API примеры
как его использовать.

А Queue быстрее List будет или нет при частом добавлении, чтении?
21 июн 19, 10:31    [21912715]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
mayton
Molasar
пропущено...

Через пул хикари получается 5к-10к сообщений в секунду.

Пул ускоряет только операцию создания нового коннекта. Если ты решаешь задачи где требуется
постояное и долго-живущее соединение (обслуживание очереди) то я-бы создал просто отдельный
объект Connection навечно. При ошибках - соотв надо предусмотреть логику реконнекта.

Пока взял готовое решение - Хикари, чтобы использовать создаваемые им соединения в отдельных потоках.
При кол-ве потоков = 2*CPU_cores + 1 получается самый производительный вариант записи в БД. Меньше или больше производительность снижается. Где-то у Oracle это прочел, на практике подтвердилось.
21 июн 19, 10:36    [21912722]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
mayton
Member

Откуда: loopback
Сообщений: 42845
Molasar
mayton
Попробуй обернуть список такой оберткой

Collections.synchronizedList(...)


Но после этого надо мерять производительность. Т.к. если ты будешь сильно часто "долбить" по такому списку
из множества потоков то синхронизирующая обёртка может стать узким местом. И посмотри в API примеры
как его использовать.

А Queue быстрее List будет или нет при частом добавлении, чтении?

Queue будет быстрее только в особых случаях. Когда у тебя в задаче есть ярко-выраженная операция с очередями.
Такая как добавить в хвост. И взять с головы. И есть 2 (и более потоков) которые это делают асинхронно
и независимо. В остальных случаях Queue может быть хуже чем List.
21 июн 19, 10:43    [21912727]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Molasar, я так думаю, что самый просто и надежный вариант и при этом приемлемый по скорости - это использовать ArrayBlockingQueue
и не париться. Если скорость не устроит - идти дальше.
21 июн 19, 11:07    [21912752]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
mayton
Molasar
пропущено...

А Queue быстрее List будет или нет при частом добавлении, чтении?

Queue будет быстрее только в особых случаях. Когда у тебя в задаче есть ярко-выраженная операция с очередями.
Такая как добавить в хвост. И взять с головы. И есть 2 (и более потоков) которые это делают асинхронно
и независимо. В остальных случаях Queue может быть хуже чем List.

В моём случае будет 2 потока:
1-ый добавляет элемент в хвост.
2-ой берет и удаляет элемент с головы.
Озверин тоже рекомендовал использовать - ArrayBlockingQueue
21 июн 19, 11:11    [21912758]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Molasar
Member

Откуда:
Сообщений: 773
Озверин
Molasar, я так думаю, что самый просто и надежный вариант и при этом приемлемый по скорости - это использовать ArrayBlockingQueue
и не париться. Если скорость не устроит - идти дальше.

Понял. Спасибо
21 июн 19, 11:12    [21912759]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить