С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 134
1

Передать HashMap в другой поток для заполнения, а затем вернуть его обратно

13.09.2019, 16:52. Показов 1715. Ответов 6

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток. Подскажите, как решить вот такую дилемму.
Столкнулся со следующей проблемой.
В основном потоке создаю HashMap и затем передаю его в качестве параметра в класс, который реализует интерфейс Runnable, что бы в другом потоке затем заполнить некоторыми значениями.
Java
1
2
3
4
5
6
7
8
9
HashMap<String, String> result = new HashMap<String, String>();
ScannigThread scanThr = new ScannigThread(result);
scanThr.start();            
try {
    scanThr.join();
}
catch(InterruptedException iExp) {
    //
}
Вот сам класс ScannigThread
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ScannigThread implements Runnable{
 
    private Thread myThr;
    private HashMap<String, String> resultOfWorking;
    
    public ScannigThread(File InitialDir, HashMap<String, String> result){
        myThr = new Thread(this, "ScanningThread");
        resultOfWorking = result;
    }
    
    public void start() {
        myThr.start();
    }
    
    public void join() throws InterruptedException {
        myThr.join();
    }
    
    @Override
    public synchronized void run() {
        resultOfWorking = HashMapWorker.work(); //Вызываю статический метод класса HashMapWorker что бы заполнить HashMap. Дебагинг показал, что этот метод удачно возвращает HashMap. И resultOfScaning не ноль и заполнен значениям
    }   
}
Но после блока try/catch основного потока мой первоначальный HahMap result пуст. В чем может быть причина?

Добавлено через 6 минут
Возможным способом решения я нашел следующее:
создать метод в классе ScannigThread, который вернет resultOfWorking. И вызвать его после того, как второй поток отработает, т.е. псоле try/catch с join() в главном потоке.
Но мне кажется это несколько неправильным подходом.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2019, 16:52
Ответы с готовыми решениями:

Передать bitmap из одной формы, изменить его в другой и вернуть обратно. как?
public Create(Bitmap bmp) { InitializeComponent(); ...

Как передать рандомно заполненный массив из одного объекта в другой с возвратом его обратно?
Народ подскажите как передать рандомно заполненный массив из одного объекта в другой, при этом из...

Заменить один текстовый файл на другой при отсутствии пинга до сервера и вернуть все обратно при его появлении
Добрый день. Нужно заменить один текстовый файл на другой при отсутствии пинга до сервера и...

Вернуть строку string обратно в поток cin
Всем доброго времени суток! Может кто нибудь подсказать как можно запихнуть строку string обратно...

6
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,026
Записей в блоге: 2
13.09.2019, 17:27 2
HashMap вроде как не является потокобезопасной коллекцией
1
Эксперт Java
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
13.09.2019, 17:27 3
Pb-BASS, вся твоя задача выглядит неправильным подходом. Зачем создавать мапу в одном потоке чтобы заполнять в другом? Почему бы не создавать в другом потоке? Какую проблему ты пытаешься решить?
1
7 / 7 / 2
Регистрация: 21.02.2019
Сообщений: 134
13.09.2019, 17:32  [ТС] 4
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Какую проблему ты пытаешься решить?
Хочу в отдельном потоке искать файлы на жестком диске, в основном в это время на ГУи какой-нибудь прогресс-бар отображать, поскольку процедура может затянуться. А вот после поиска мне список этих фалов необходимо на ГУИ отобразить. Поэтому и Коллекция создается в основном потоке.

Добавлено через 36 секунд
Но вот да, HashMap не самый лучший вариант для этого, я сейчас подумал.
0
4865 / 2664 / 913
Регистрация: 29.11.2010
Сообщений: 5,745
13.09.2019, 18:19 5
Если вы используете JavaFX, в нем есть набор классов для задач многопоточности.
2
Эксперт функциональных языков программированияЭксперт Java
4542 / 2736 / 486
Регистрация: 28.04.2012
Сообщений: 8,645
13.09.2019, 18:40 6
Pb-BASS, начни с чтения “Java Concurrency in practice”, ибо твой код крайне кривой.
1
Эксперт Java
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
14.09.2019, 10:07 7
Pb-BASS, мапу создавай внутри потока и возвращай по завершении. Внутрь передавай интерфейс который будет лиссенером прогресса поиска. Если на джава 8, то ламбду юзай.
Если нужно показывать результаты по мере нахождения, то там механизм будет producer-consumer. В сети полно мануалов на эту тему.
2
14.09.2019, 10:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2019, 10:07
Помогаю со студенческими работами здесь

Как вернуть символ обратно в поток ввода
Добрый день. Подскажите, пожалуйста, аналог функции cin.putback() из C++, которая возвращает...

Как считать информацию из запущенного мной процесса, а затем вернуть её обратно?
Пытаюсь запустить powershell и отправить в него команду, которая запустит в нем скрипт. Задача...

Как получить объектную модель из XML, записать в класс и затем вернуть обратно в XML Qt 5.13
Всем доброго времени суток. Есть вот такой кусок xml файла: &lt;copyright&gt;...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru