powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ExecutorService
36 сообщений из 36, показаны все 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
ExecutorService
    #37672778
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
счас посмотрю скорости записи БД (где-то было)
...
Рейтинг: 0 / 0
ExecutorService
    #37672788
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ОзверинПетро, а ты я знаю хибером увлекся, пытался работать не с Рсубд+хибер?) Какие нить mongoDb и тд пробовал?)
неперспективно, поэтому тока хибер.
Если приготовить обычную БД, то другая не понадобится.
ЗЫ.
Да и потом - куда тебе торопится в записи для твоей задачи? :)


Времени жалко ;))
...
Рейтинг: 0 / 0
ExecutorService
    #37672798
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123счас посмотрю скорости записи БД (где-то было)

у меня MySQL 5.1
запись в базу из 2х таблиц:

tbl1: key(bigint, varchar(25), varchar(100)
tbl2: logrow(biging, varchar(255), varchar(512), varchar(2048), varchar(512), varchar(512), key_id)

ps = createPreparedStatement();
ps.addBatch();
ps.executeBatch();
...
Рейтинг: 0 / 0
ExecutorService
    #37672799
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинВремени жалко ;))
ВИ без ОРМ
- быстрее всего СУБД пишет файл своего формата
- а) все читатели его готовят
- б) субд одним махом его заберёт и моргнуть не успеешь.
...
Рейтинг: 0 / 0
ExecutorService
    #37672830
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, как обещал, для размышлений:

Iskander
Код: plaintext
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
> А в скорости инсертов и апдейтов. Индексы нехило тормозят запись.
Можешь проверь скорость оракла в следующей ситуации на обычном десктопе? Академический интерес.

Есть две таблицы:

create table t1 (id integer, f1 integer, f2 integer, f3 integer, f4 integer, f5 integer);

create index t1_idx_f1 on t1 (f1);
create index t1_idx_f2 on t1 (f2);
create index t1_idx_f3 on t1 (f3);
create index t1_idx_f4 on t1 (f4);
create index t1_idx_f5 on t1 (f5);
create index t1_idx_id on t1 (id);

create table t2 (id integer, f1 integer, f2 integer, f3 integer, f4 integer, f5 integer);

Заполняем t2 случайными данными и замеряем время:

create or alter procedure proc_fill
as
declare variable var_count integer;
begin
  var_count = 0;
  while (var_count < 100000) do
  begin
    insert into t2 (id, f1, f2, f3, f4, f5)
    values (:var_count,
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer),
      cast(rand() * 1000000 as integer)
    );
    var_count = var_count + 1;
  end
end

Выполняем следующий запрос и замеряем время:

insert into t1 select * from t2

Firebird 2.5, Super Server, все параметры по умолчанию + WinXP 32bit, E5200 @ 2.5GHz, 2GB RAM, обычный SATA винт
Вставка 100к записей без индексов - 1 сек.
Переливание этих данных в таблицу с шестью индексами - 9 сек.
=======================
Вот тебе статистика с фаирберд.

insert into t1 select * from t2

Обе таблицы без индексов, шесть интежер полей. На 1кк записей такая вставка выполняется 5 секунд. Построение всех шести индексов еще 9 секунд. В сумме - 14 секунд. Если в t1 перед вставкой индексы не отключать, то запрос выполняется 100 секунд.
=================
...
Рейтинг: 0 / 0
ExecutorService
    #37672832
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ОзверинВремени жалко ;))
ВИ без ОРМ
- быстрее всего СУБД пишет файл своего формата
- а) все читатели его готовят
- б) субд одним махом его заберёт и моргнуть не успеешь.

Ход мысли не очень понял.
...
Рейтинг: 0 / 0
ExecutorService
    #37672839
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

про индексы и ежу понятно.
@ManyToOne(cascade = CascadeType.ALL) key.id->logrow.key_id.
...
Рейтинг: 0 / 0
ExecutorService
    #37672856
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,
>Ход мысли не очень понял.
У каждой субд есть утилита или API для массовой закачки данных.
Она отключает все тормоза у себя и обратно включает после заливки.
Для MySQL поспрошай - я не в курсе.
Один из вариантов давно делал. ~ 50 K или файл 500 мегов
/topic/103823
т.е. это ещё быстрее чем пример выше без индексов
...
Рейтинг: 0 / 0
ExecutorService
    #37672859
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрел кстати LinkedBlockingQueue, на самом деле в конструкторе можно указать capacity, и тогда она станет ограниченной, вроде linkedQueue должна пошустрее работать чем ArrayBlockingQueue.
Также посмотрел Java Concurrency in Practice - ваш пример есть в 7 главе, там авторы обращают внимание, что необходимо продумать, как грамотно остановить логирующий поток, весьма занимательно, если есть время - почитайте, там все очень хорошо расписано.
...
Рейтинг: 0 / 0
ExecutorService
    #37672885
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, спасибо всем.
По поводу "Java Concurrency in Practice" - как раз листаю ;)
...
Рейтинг: 0 / 0
ExecutorService
    #37672924
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,
будут цифры - выложи
т.е. если БД без оверхеда на сеть и ОРМ пишет 100K в сек.
То тебе достаточно 1 потока imho.
Удачи!
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / ExecutorService
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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