Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
7 / 7 / 1
Регистрация: 14.11.2012
Сообщений: 73

Синхронизация работы listener

28.03.2017, 18:54. Показов 825. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Нужна помощь с синхронизацией потоков.
Есть функция main в которой структура userMap заполняется с помощью функции getUsersHashMap.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void main()
{
//...
        ConcurrentHashMap<String, User> userMap = new ConcurrentHashMap<String, User>();
        DBConnector connector = new DBConnector();
 
        connector.getUsersHashMap(userMap);
 
        synchronized (userMap)
        {
            while (userMap.isEmpty()){
                try {
                    userMap.wait();
                }
                catch (InterruptedException e) {
                }
            }
        }
 
 
//...
}
ValueEventListener заполняет данные в listener.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public synchronized ConcurrentHashMap<String, User> getUsersHashMap(final ConcurrentHashMap<String, User> hashMap) {
    synchronized (hashMap) {
        final FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference ref = database.getReference("/users");
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                    hashMap.put(...)
                    );
                }
            }
 
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });
        hashMap.notify();
        return hashMap;
    }
}
Как сделать так, чтобы основной поток приостанавливал свое действие до получения данных в userMap? Я так понял, что моя программа попадает в deadlock.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.03.2017, 18:54
Ответы с готовыми решениями:

Что такое Listener ?
Дайте пожалуйста ссылку на адекватную информацию, а то гугл думает, что я уже в курсе, и выдает очень сложные примеры. Заранее спасибо)

Status : Failure -Test failed: Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given
listener.ora: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME =...

DBLookupCombobox - синхронизация работы
Люди, помогите сломал всю голову уже на ровном месте у меня есть 2 компонента DBLookupCombobox один - отображает список...

1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
28.03.2017, 21:33
Sublimee, я не понял, зачем тебе вся эта фигня, но вот как-то так, например:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public final class Sublimee {
 
    public static void main(String[] args) {
        final ExecutorService executor = Executors.newSingleThreadExecutor();
        final Future<Map<String, User>> usersFetch = executor.submit(() -> {
            try {
                return getAllUsers().stream().collect(Collectors.toMap(
                        User::getId,
                        Function.identity()
                ));
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new ExecutionException("Interrupted!", e);
            }
        });
        try {
            println("Can do some shit while users are loading…");
            Thread.sleep(1000L);
 
            println("Can do some more shit…");
            Thread.sleep(1000L);
 
            println("Ok, it's borring. Let's lock and wait for users to be loaded…");
            final Map<String, User> users = usersFetch.get();
 
            println("Now we get some users!");
            users.forEach((id, user) -> println(id + ". " + user));
 
        } catch (ExecutionException e) {
            println("Something went wrong while loading users: " + e.getMessage());
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            println("Interrupted!");
        } finally {
            executor.shutdown();
        }
    }
 
    private static List<User> getAllUsers() throws InterruptedException {
        Thread.sleep(4000L); // simulate long loading
        return Stream.of(
                new User("1", "Vasily", "Pupkin"),
                new User("2", "Alexey", "Parovozkin")
        ).collect(Collectors.toList());
    }
 
    private static void println(String s) {
        System.out.println(LocalTime.now().format(DateTimeFormatter.ISO_TIME) + ": " + s);
    }
 
    private static final class User {
 
        private final String id;
        private final String firstName;
        private final String lastName;
 
        public User(String id, String firstName, String lastName) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
        }
 
        public String getId() {
            return id;
        }
 
        public String getFirstName() {
            return firstName;
        }
 
        public String getLastName() {
            return lastName;
        }
 
        @Override
        public String toString() {
            return firstName + ' ' + lastName;
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2017, 21:33
Помогаю со студенческими работами здесь

Синхронизация работы нитей
Синхронизировать три нити одного процесса с помощью автоматической синхронизации. Каждая нить выводит на экран монитора два ...

Синхронизация работы с файлами
У меня одна страница удаляет файл после использования, а вторая добавляет туда данные. Нужно как то синхронизировать их работу. Чтобы...

Синхронизация работы двух моторов
Есть платформа для робота, два передних колеса являются ведущими, каждое имеет свой мотор. Сзади установлено одно колесо, которое может...

Потоки, синхронизация для работы с формой
Доброго времени суток. Собственно сабж. На форме есть text box - tbStatus в которую пытаюсь писать из разных потоков, сами потоки устроены:...

Синхронизация работы циклов в разных потоках
Помогите советами... как синхронизировать циклы в разных потоках. Есть основной метод в &quot;главном потоке&quot; в котором крутится...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru