powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ExecutorService
25 сообщений из 36, страница 1 из 2
ExecutorService
    #37672665
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть основной поток, который собирает некую информацию в list и отдает ее сейвить в отдельный поток.
Пока информация сохраняется, основной поток продолжает работу. Как только пришло время снова сохранить информацию, он проверяет наличие запущенных потоков, если есть - ждет их окончания.

Дело в том, что getActiveCount() в javadoc написано, что
авторreturns the approximate number of threads that are actively executing tasks.
и меня это беспокоит.

Как правильно решить подобную задачу с помощью ExecutorService?






Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
ThreadPoolExecutor service = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);

    while (service.getActiveCount()>0) {
                try {
                    Thread.sleep(millis);
                    logger.info("waiting for the end of save thread ");
                } catch (InterruptedException e) {
                    logger.error(e.getMessage());
                }
            }

     Runnable task = new Runnable() {
                @Override
                public void run() {
                    try {
                        saver.save(list);
                    } catch (DaoException e) {
                        throw new RuntimeException(e);
                    }
                }
            };

           try{
                service.execute(task);
            } catch (Exception e) {
                throw  new ServiceException(e);
            }
...
Рейтинг: 0 / 0
ExecutorService
    #37672675
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинКак только пришло время снова сохранить информацию, он проверяет наличие запущенных потоков, если есть - ждет их окончания .
А зачем это? Не проще ли в очередь положить?
...
Рейтинг: 0 / 0
ExecutorService
    #37672695
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

это к вопросу о парсинге файла на 30КК записей ;)
Так как скорость чтения много превосходит скорость записи, то есть подозрение что рано или поздно я упрусь в то, что надо будет ждать завершения потока, чтобы опять в outOfMemory не прийти.
...
Рейтинг: 0 / 0
ExecutorService
    #37672714
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,
мелкий вопрос.
А зачем тебе читать быстрее записи?
авторТак как скорость чтения много превосходит скорость записи
она у всех превосходит.
...
Рейтинг: 0 / 0
ExecutorService
    #37672721
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Озверин,
мелкий вопрос.
А зачем тебе читать быстрее записи?
авторТак как скорость чтения много превосходит скорость записи
она у всех превосходит.

Отличный вопрос. И ответ такой же: хочу оптимизировать общее время на сумму операций, т.е. чтобы издержка на ожидание записи была минимальной.
...
Рейтинг: 0 / 0
ExecutorService
    #37672728
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже придерживаюсб мнения, что тут Executor лишний, тут классическая схема - один потребитель один производитель. А такая ситуация разруливается через расшаренную queue, в java concurrency in practice даже пример есть, там все потоки скидывают таски по логированию в queue, а потребитель читает таски и пишет в базу.
...
Рейтинг: 0 / 0
ExecutorService
    #37672729
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинэто к вопросу о парсинге файла на 30КК записей ... чтобы опять в outOfMemory не прийти.Реализовать циклический буфер "поверх массива фиксированного размера"?
...
Рейтинг: 0 / 0
ExecutorService
    #37672730
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему при создании ThreadPoolExecutor нужно использовать ArrayBlockingQueue. В этом случае, если очередь заполнена до определенного предела, то вызывающий поток заблокируется, пока рабочие потоки не освободят место в очереди.
Не совсем то что вы просили, но, по-моему, решает ту же самую задачу.
...
Рейтинг: 0 / 0
ExecutorService
    #37672733
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никЯ тоже придерживаюсб мнения, что тут Executor лишний, тут классическая схема - один потребитель один производитель. А такая ситуация разруливается через расшаренную queue, в java concurrency in practice даже пример есть, там все потоки скидывают таски по логированию в queue, а потребитель читает таски и пишет в базу.


executorService так же имеет queue со всеми вытекающими.
...
Рейтинг: 0 / 0
ExecutorService
    #37672735
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПо-моему при создании ThreadPoolExecutor нужно использовать ArrayBlockingQueue. В этом случае, если очередь заполнена до определенного предела, то вызывающий поток заблокируется, пока рабочие потоки не освободят место в очереди.
Не совсем то что вы просили, но, по-моему, решает ту же самую задачу.

Вы правы, но я так понимаю Озверин хочет избежать блокирования основного воркера.
...
Рейтинг: 0 / 0
ExecutorService
    #37672737
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПо-моему при создании ThreadPoolExecutor нужно использовать ArrayBlockingQueue. В этом случае, если очередь заполнена до определенного предела, то вызывающий поток заблокируется, пока рабочие потоки не освободят место в очереди.
Не совсем то что вы просили, но, по-моему, решает ту же самую задачу.

дело в том, что и при service.execute() насколько я понял ThreadPoolExecutor если нет свободных потоков, ставит таску в ожидание(по умолчанию я так глянул засовывает ее в LinkedBlockingQueue и как только появляется свободный поток - исполняет таску.
...
Рейтинг: 0 / 0
ExecutorService
    #37672740
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никВы правы, но я так понимаю Озверин хочет избежать блокирования основного воркера.
Наоборот. При определенном размере очереди, нужно сказать читающим потокам - хватит читать. Память засрана. Дайте писателям сбросить очередь в вывод.
...
Рейтинг: 0 / 0
ExecutorService
    #37672741
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторexecutorService так же имеет queue со всеми вытекающими.
Если постараться, то можно сюда и Fork/Join прикрутить, вопрос зачем-? Я придерживаюсь мнения что использования инструмента не по назначению, только запутывают код, стандартным решением тут является расшаренная queue, но вы конечно вольны делть как хотите.
...
Рейтинг: 0 / 0
ExecutorService
    #37672746
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Из потока ничего не хочу получать
2. Чем плоха очередь, я на запись передаю целую тучу данных(пусть это будет не 1 поток, а 10 параллельных) в сумме эти записи , не следи я за кол-вом , завалят меня в outOfMemory. Вывод : рано или поздно у меня возникнет проблема с тем, чтобы ожидать завершения 1го (или более) потоков, чтобы по их завершени GC мог сделать свое грязное дело.
...
Рейтинг: 0 / 0
ExecutorService
    #37672747
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНаоборот. При определенном размере очереди, нужно сказать читающим потокам - хватит читать. Память засрана. Дайте писателям сбросить очередь в вывод.

А, ну да, тогда вы абсолютно правы
...
Рейтинг: 0 / 0
ExecutorService
    #37672748
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧем плоха очередь, я на запись передаю целую тучу данных(пусть это будет не 1 поток, а 10 параллельных) в сумме эти записи , не следи я за кол-вом , завалят меня в outOfMemory. Вывод : рано или поздно у меня возникнет проблема с тем, чтобы ожидать завершения 1го (или более) потоков, чтобы по их завершени GC мог сделать свое грязное дело.

Говорили же что есть такое понятие как bounded queue, в частности реализована в ArrayBlockingQueue
...
Рейтинг: 0 / 0
ExecutorService
    #37672750
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озвериндело в том, что и при service.execute() насколько я понял ThreadPoolExecutor если нет свободных потоков, ставит таску в ожидание(по умолчанию я так глянул засовывает ее в LinkedBlockingQueue и как только появляется свободный поток - исполняет таску.
Почитайте JavaDoc к ThreadPoolExecutor. Так как вы создаёте через фабрику - Executors, то там нет заготовки для ArrayBlockingQueue.
LinkedBlockingQueue - как раз, и есть бесконечная очередь. Поэтому и не блокируется вызывающий поток. Очередь нужно заменить на конечную и всё.
...
Рейтинг: 0 / 0
ExecutorService
    #37672751
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczзабыл никВы правы, но я так понимаю Озверин хочет избежать блокирования основного воркера.
Наоборот. При определенном размере очереди, нужно сказать читающим потокам - хватит читать. Память засрана. Дайте писателям сбросить очередь в вывод.

т.е. для executorService делать что то вроде
executorService.getQueue() и работать с ней уже? Я просто именно с новыми средствами java мало работал по многопоточности.
...
Рейтинг: 0 / 0
ExecutorService
    #37672754
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинЕсть основной поток, который собирает некую информацию в list и отдает ее сейвить в отдельный поток.
я боюсь, что если мы говорим о субд , то ускорить запись методом:
- потоки и распараллеливание = 1%
- пакетная запись и оптимизация самой СУБД = 70%
...
Рейтинг: 0 / 0
ExecutorService
    #37672755
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОзвериндело в том, что и при service.execute() насколько я понял ThreadPoolExecutor если нет свободных потоков, ставит таску в ожидание(по умолчанию я так глянул засовывает ее в LinkedBlockingQueue и как только появляется свободный поток - исполняет таску.
Почитайте JavaDoc к ThreadPoolExecutor. Так как вы создаёте через фабрику - Executors, то там нет заготовки для ArrayBlockingQueue.
LinkedBlockingQueue - как раз, и есть бесконечная очередь. Поэтому и не блокируется вызывающий поток. Очередь нужно заменить на конечную и всё.

ок, этого хотел услышать, видимо ;)
...
Рейтинг: 0 / 0
ExecutorService
    #37672760
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ОзверинЕсть основной поток, который собирает некую информацию в list и отдает ее сейвить в отдельный поток.
я боюсь, что если мы говорим о субд , то ускорить запись методом:
- потоки и распараллеливание = 1%
- пакетная запись и оптимизация самой СУБД = 70%

вполне вероятно. Но я не запись ускоряю, я сокращаю время ожидания записи.
Насчет оптимизации самой субд - тоже стараюсь двигаться.
...
Рейтинг: 0 / 0
ExecutorService
    #37672764
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинт.е. для executorService делать что то вроде
executorService.getQueue() и работать с ней уже? Я просто именно с новыми средствами java мало работал по многопоточности.

Блин, ну вроде же не rocket sience:
Код: java
1.
new ThreadPoolExecutor(bla-bla-bla, new ArrayBlockingQueue(...));
...
Рейтинг: 0 / 0
ExecutorService
    #37672765
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ОзверинЕсть основной поток, который собирает некую информацию в list и отдает ее сейвить в отдельный поток.
я боюсь, что если мы говорим о субд , то ускорить запись методом:
- потоки и распараллеливание = 1%
- пакетная запись и оптимизация самой СУБД = 70%

Петро, а ты я знаю хибером увлекся, пытался работать не с Рсубд+хибер?) Какие нить mongoDb и тд пробовал?)
...
Рейтинг: 0 / 0
ExecutorService
    #37672768
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинНо я не запись ускоряю, я сокращаю время ожидания записи.
ты не думал, что выше фраза - это анекдот от профи.
Смысл фразы не раскрыт :)
...
Рейтинг: 0 / 0
ExecutorService
    #37672775
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинПетро, а ты я знаю хибером увлекся, пытался работать не с Рсубд+хибер?) Какие нить mongoDb и тд пробовал?)
неперспективно, поэтому тока хибер.
Если приготовить обычную БД, то другая не понадобится.
ЗЫ.
Да и потом - куда тебе торопится в записи для твоей задачи? :)
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / ExecutorService
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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