Кластеризация с использованием потоков в Java - PullRequest
0 голосов
/ 19 августа 2009

У меня есть работа, которая занимает слишком много времени в Java. Поэтому я хочу разделить эту работу на потоки и запустить их. После того, как потоки завершают свою работу, возвращаются в мой сервис, а сервис предоставляет им новые задания. ThreadGroup подходит для этой или любой другой рекомендации?

Ответы [ 5 ]

3 голосов
/ 19 августа 2009

Прежде всего, вам нужны потоки, если либо:

а) У вас есть многопроцессорная машина

или b) У вас есть один процессор, но ваши задания интенсивно работают с вводом-выводом (и не нагружают процессор)

В противном случае вы ничего не получите при использовании потоков.

Здесь вам нужно ThreadPool

1 голос
/ 19 августа 2009

Проверьте ExecutorCompletionService - он делает именно это.

Пример : [извлечено из Java 6 API JavaDocs]

 void solve(Executor e, Collection<Callable<Result>> solvers)
     throws InterruptedException, ExecutionException {
       CompletionService<Result> ecs
           = new ExecutorCompletionService<Result>(e);
       for (Callable<Result> s : solvers)
           ecs.submit(s);
       int n = solvers.size();
       for (int i = 0; i < n; ++i) {
           Result r = ecs.take().get();
           if (r != null)
               use(r);
       }
   }
1 голос
/ 19 августа 2009

Не уверен, в каком состоянии находится ваш проект в настоящее время, поскольку формулировка вашей проблемы весьма ограничена, но вы можете рассмотреть возможность взглянуть на проект fork-join, выходящий в JDK7: http://www.ibm.com/developerworks/java/library/j-jtp11137.html

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

(Может быть неприменимо для всего, что вам нужно реализовать прямо сейчас , но стоит посмотреть, тем не менее, если вы собираетесь разрабатывать / поддерживать свое приложение в течение некоторого времени в будущем)

0 голосов
/ 19 августа 2009

ThreadGroup обычно не очень полезен для кода приложения. Это также не очень полезно для контейнерного кода. Подключаемый модуль Java использует ThreadGroup, чтобы определить, к какому апплету принадлежит поток.

java.util.concurrent, в частности ExecutorService, предоставляет, среди прочего, удобные утилиты для обработки потоков и параллелизма.

Для вычислительных задач с высокой степенью детализации полезна инфраструктура fork-join в JDK7.

Прежде чем приступить к написанию этого сложного кода, вы можете подумать, стоит ли оно того. Можете ли вы сделать другие оптимизации, которые не требуют масштабного использования потоков? Вы пытаетесь справиться с задержкой ввода / вывода? Если он интенсивно использует процессор, нет смысла использовать гораздо больше потоков, чем в аппаратном обеспечении.

0 голосов
/ 19 августа 2009

Посмотрите на пакет java.util.concurrent .

Здесь есть учебник, где вы должны найти все, что вам нужно знать:

http://java.sun.com/docs/books/tutorial/essential/concurrency/

Сфокусируйтесь на Объектах параллелизма высокого уровня в частности.

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