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

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

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

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

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

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

Откуда: Питер
Сообщений: 166
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

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

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

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

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

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

Откуда:
Сообщений: 2814
Лучше не стоит. Ни создавать ни стартовать. И вообще лучше переходить к многопточном коду только после прочтения хотя бы 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

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

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

Откуда:
Сообщений: 700
Озверин
Озверин
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

Откуда:
Сообщений: 700
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
Сообщений: 41020
Попробуй обернуть список такой оберткой

Collections.synchronizedList(...)


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

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

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


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

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

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

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


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

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

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


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

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

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

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

Collections.synchronizedList(...)


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

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

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

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

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

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

Откуда: loopback
Сообщений: 41020
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

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

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

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

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

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

Понял. Спасибо
21 июн 19, 11:12    [21912759]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
mayton
Member

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

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

В моём случае будет 2 потока:
1-ый добавляет элемент в хвост.
2-ой берет и удаляет элемент с головы.
Озверин тоже рекомендовал использовать - ArrayBlockingQueue

Ну... что-ж. Тогда выхода нет. Надо брать :)
21 июн 19, 11:55    [21912808]     Ответить | Цитировать Сообщить модератору
 Re: Запуск потоков в конструкторе класса  [new]
Sergunka
Member

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

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

В моём случае будет 2 потока:
1-ый добавляет элемент в хвост.
2-ой берет и удаляет элемент с головы.
Озверин тоже рекомендовал использовать - ArrayBlockingQueue


Я лет шесть назад написал код на интервью (просто тупо вживую индюку... индюк аж припух ) и потом уже оформил в виде статьи блога
https://vyatkins.wordpress.com/2013/12/21/sleeping-barber-problem/

Потом уже после долгих и смачных дискуссий написал несколько вариаций на эту тему. Все в статье. С исходниками на гихабе
https://github.com/SVyatkin/KafkaSleepingBarberProblem/tree/master/src/main/java/com/sleeping/barber/blockingQueue

Я бы обратил внимание как легко и непринужденно можно от простого потока уйти на пул экзекьютор - хороший навык много где пригодится.
21 июн 19, 21:59    [21913219]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Java Ответить