Любой доступный шаблон дизайна для потока, который способен выполнять определенное задание, отправленное другими потоками? - PullRequest
3 голосов
/ 01 февраля 2012

Я работаю над проектом, где время выполнения критично. В одном из моих алгоритмов мне нужно сохранить некоторые данные в базу данных.

Что я сделал, так это вызвал метод, который это делает. Он запускает новый поток каждый раз, когда он вызывается. Я столкнулся с проблемой выхода из памяти, так как загруженные потоки более 20000 ...

Мой вопрос теперь таков: я хочу запустить только один поток, когда метод вызывается, он добавляет задание в очередь и уведомляет поток, он спит, когда нет доступных заданий и так далее. Какие-либо шаблоны дизайна доступны или примеры доступны в Интернете?

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

Беги, не ходи к своим дружелюбным Javadocs и смотри вверх ExecutorService, особенно Executors.newSingleThreadExecutor().

ExecutorService myXS = Executors.newSingleThreadExecutor();

// then, as needed...

myXS.submit(myRunnable);

А с остальными он справится.

2 голосов
/ 01 февраля 2012

Да, вам нужен рабочий поток или шаблон пула потоков.

http://en.wikipedia.org/wiki/Thread_pool_pattern

См. http://www.ibm.com/developerworks/library/j-jtp0730/index.html для примеров Java

1 голос
/ 01 февраля 2012

Вы ищете java.util.concurrent.Executor?

Тем не менее, если у вас есть 20000 одновременных вставок в базу данных, использование пула потоков, вероятно, не спасет вас: если база данных не может поддерживать, очередь будет становиться все длиннее и длиннее, пока вы снова не исчерпаете память , Также обратите внимание, что очередь исполнителей является нестабильной, то есть, если сервер выходит из строя, данные на нем исчезнут.

1 голос
/ 01 февраля 2012

Я считаю, что шаблон, который вы ищете, называется производителем-потребителем.В Java вы можете использовать методы блокировки в BlockingQueue для передачи задач от производителей (которые создают задания) потребителю (единственный рабочий поток).Это приведет к тому, что рабочий поток автоматически перейдет в спящий режим, если в очереди нет доступных заданий, и проснется при его добавлении.Параллельные коллекции также должны обрабатываться с использованием нескольких рабочих потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...