Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ExecutorService / 25 сообщений из 36, страница 1 из 2
21.02.2012, 15:36:42
    #37672665
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ExecutorService
Есть основной поток, который собирает некую информацию в 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
21.02.2012, 15:40:47
    #37672675
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ExecutorService
ОзверинКак только пришло время снова сохранить информацию, он проверяет наличие запущенных потоков, если есть - ждет их окончания .
А зачем это? Не проще ли в очередь положить?
...
Рейтинг: 0 / 0
21.02.2012, 15:51:42
    #37672695
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ExecutorService
Blazkowicz,

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

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


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

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

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

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

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

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

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

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

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

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


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