hudrogen
@hudrogen

Как получить данные из потоков обратно в main в java?

В методе main есть
public static ArrayList<DataForDepth> list = new ArrayList<DataForDepth>(100);

будем считать что лист заполнен данными
Далее я в цикле запускаю потоки, каждый поток обрабатывает элемент листа (математические операции).
for (int i = 0; i < 100; i++) {
			MyRunnable mRnbl = new MyRunnable(i, list.get(i));
			new Thread(mRnbl).start();	
		}


Как мне в maine собрать в другой ArrayList res результаты обработки потоков?
  • Вопрос задан
  • 4220 просмотров
Пригласить эксперта
Ответы на вопрос 5
targetjump
@targetjump
Смотрите ForkJoinPool
Ответ написан
Комментировать
@bromzh
Drugs-driven development
Можно использовать Future. Ну или синхронизацию.
Кстати, для многопоточности надо использовать контейнеры, которые специально заточе.... А судя по приведённому коду, тебе нужно почитать литературу по многопоточности в java, а не спрашивать тут такие вещи. Тогда и таких вопросов не будет возникать.
Ответ написан
@nirvimel
Для этого существует очередь LinkedBlockingQueue.
Потоки пишут в нее возвращаемые значения, промаркированные id задания.
main читает из нее и восстанавливает массив возвращаемых значений по их id, не опираясь на порядок элементов в очереди, который ничем не гарантирован.
Ответ написан
Комментировать
@protven
Используйте коллекции, как уже советовали выше, например очереди или Map'ы. Лучше использовать из пакета java.util.concurrent
Еще можно заюзать новый интерфейс Callable -

docs.oracle.com/javase/7/docs/api/java/util/concur...

Который как раз может возвращать значение, в отличии от Runnable.
Ответ написан
Комментировать
@volyihin
Разработчик
Стартонуть 100 потоков - не лучшая идея. Если у вас конечно не 100 ядерный сервер или кластер.

Создатт ExecutorPool на количество с n + 1 потоков. И запихните туда свой Callable. А потом ждите результата на get()

Вот тут официальный оракловский туториал, как это сделать. Я уверен он поможет разобраться.

https://blogs.oracle.com/CoreJavaTechTips/entry/ge...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы