Как получить информацию из нескольких потоков? Джава - PullRequest
1 голос
/ 03 августа 2011

Я хочу запустить несколько вызываемых потоков одновременно (в цикле) и хочу вернуть некоторую информацию от всех в основном потоке.Как это реализовать?

Ответы [ 4 ]

3 голосов
/ 03 августа 2011

Невозможно сказать лучший подход из вашего вопроса, потому что мы ничего не знаем о сценарии использования! Но, вообще говоря, вы могли бы создать пул потоков, используя Executors.newFixedThreadPool(), а затем отправить общие Callable<T> объекты в пул потоков - вы получите Future<T>.

В главном потоке вы можете затем зациклить фьючерсы, вызывая каждый из get() методов, которые будут блокироваться, пока соответствующий вызываемый объект не завершит выполнение в пуле потоков.

1 голос
/ 03 августа 2011

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

int nSize = <some nomber>;
MyThread myThreadArray[] = new MyThread[nSize];

for(int i = 0; i < nSize; i++) {
  myThreadArray[i] = new MyThread();

  // Init and start the thread.
}

// Wait for all thread to end.

for(int i = 0; i < nSize; i++) {
  myThreadArray[i].getData();
}

Вместо массива фиксированного размера может использоваться любой тип List.

Редактировать / Дополнение:

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

int nSize = <some nomber>;
MyThreadData myThreadDataArray[] = new MyThreadData[nSize];

for(int i = 0; i < nSize; i++) {
  Thread thread = new MyThread(myThreadDataArray[i]);

  // Init and start the thread.
}

// Wait for all thread to end.

for(int i = 0; i < nSize; i++) {
  // Do something with myThreadDataArray[i].
}

Это позволит gc быстрее восстанавливать объекты Thread, если вам нужно работать с данными потока в течение длительного времени после завершения потока.

0 голосов
/ 03 августа 2011

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

0 голосов
/ 03 августа 2011

Насколько я понимаю, приоритет запуска и остановки потоков в Java не гарантируется. Некоторые потоки могут перейти в режим ожидания после того, как они начали уступать другому потоку, возможно, потому, что он ожидает ввода / вывода.

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

Почему потоки 10000 вызовов start () занимают больше времени, чем 10000 вызовов run ()?

...