Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> thread pool 
:(
    Опции темы
headzero
Дата 19.9.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 14.11.2006

Репутация: нет
Всего: 1



Моя задача следующая: требуется реализовать пул потоков, причем каждый из потоков, который бежит будет добавлять новые таски на исполнение в очередь. В среднем потоки живут 5-10 секунд и добавляют новых 10- 20 тасков. Как мне это реализовать?

Я думал так сделать(схематично пример):

Код

public static void main(String[] args) {
            ExecutorService executor = Executors.newFixedThreadPool(10);
            MyTask task = new MyTask(executor);
}

class MyTask implements Runnable {
 
            private ExecutorService exec;

            public MyTask(exec) {
                           this.exec = exec;
            }

public void run() {
             for(int i = 10;i<10;i++) {
                       exec.execute(new MyTask(exec));  //каждый таск добавит еще по 10 тасков в очередь.
             }
    }
}


Будет ли так работать? Я правильно понимаю что я могу просто вызавать execute, при этом задачи будут автоматически добавлены в очередь и пойдут в работу, когда один из 10 потоков освободиться? И если не правильно, тот как лучше сделать? А что с очередью? Можно ли как то  ограничить ее размер или приостановить работу, если она достигла опреедленного значения? А то потоков много каждый живет мало, но добавляет много новых задач, поэтому очередь быстро вырастит до невообразимых размеров. Спасибо.


p.s начал поглядывать в сторону ThreadPoolExecutor, но не могу разобраться с параметрами . Вот из документации:
Код


corePoolSize - the number of threads to keep in the pool, even if they are idle.  - Что это значит? Количесво потоков которые будут в пуле?

maximumPoolSize - the maximum number of threads to allow in the pool. - Максимальный размер пула?

keepAliveTime - when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating. - Что это значит?

unit - the time unit for the keepAliveTime argument. - это понятно)

workQueue - the queue to use for holding tasks before they are executed. This queue will hold only the Runnable tasks submitted by the execute method. - зачем нам доступ к очереди?


Поясните пожалуста.


Это сообщение отредактировал(а) headzero - 19.9.2009, 18:48


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
PM MAIL   Вверх
Galaran
Дата 20.9.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.5.2009

Репутация: 1
Всего: 2



Цитата(headzero @  19.9.2009,  18:29 Найти цитируемый пост)
Я правильно понимаю что я могу просто вызавать execute, при этом задачи будут автоматически добавлены в очередь и пойдут в работу, когда один из 10 потоков освободиться?


правильно. метод execute() thread-safe.

Цитата(headzero @  19.9.2009,  18:29 Найти цитируемый пост)
p.s начал поглядывать в сторону ThreadPoolExecutor, но не могу разобраться с параметрами 


нашёл вот это
http://www.javamex.com/tutorials/threads/t...ls_queues.shtml



PM MAIL   Вверх
headzero
Дата 21.9.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 14.11.2006

Репутация: нет
Всего: 1



спасибо, Galaran
почитал, как раз то что нужно

Но вот еще вопрос, может кто подскажет: я сделал все работает нормально. но вот следующая проблема, очередь набираеться быстро,так как в очередь кладется новый обект  
Код

exec.execute(new MyTask(exec));

и через 5 минут размер програмы растет до 100 M

как же мне сделать что бы контролировать размер очереди? в принципе если каждое запущеное задание дает еще 10-20 новых, то рост неизбежен, я вижу решение только в сериализации, когда новые задачи можно сохранить на диск, а потом подтягивать. рост неизбежен все равно, но на диске больше места все таки чем в выделеной памяти.

Добавлено через 6 минут и 45 секунд
в целом это приложение типа многопоточного поискового робота:  каждая задача получает ссылку, скачавает страницу,парсит ее, вытягивая ссылки, затем создает столько задач сколько и ссылок, т.е схематично так:

Код

while(page.nextLink()) {
             exec.execute(new MyTask(exec,link));
}


Есть еще вариант сохранять только ссылки, а затем запускать задачи в другой части кода - при этом сами линки буду занимать намного меньше памяти, чем обьекты.
Пока не зная что делать. Если кто знает подскажите как сделать.


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
PM MAIL   Вверх
COVD
Дата 21.9.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

я вижу решение только в сериализации

Значит вам нужна очередь, поддерживающая persistence. Например, http://activemq.apache.org/amq-message-store.html.

Цитата

Есть еще вариант сохранять только ссылки

Конечно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.