#java #multithreading #initialization #guice #eager-loading
#java #многопоточность #инициализация #guice #нетерпеливая загрузка
Вопрос:
Я хотел бы выполнить быструю инициализацию нескольких синглетов, но инициализация может занять порядка минут, поэтому я бы хотел, чтобы инициализация происходила в отдельном потоке. Есть ли способ сделать это?
Комментарии:
1. можете ли вы использовать прокси этих синглетов? вы хотите распараллелить инициализацию этих дорогостоящих синглетов только на этапе подключения?
2. Если у вас есть несколько синглетов, для инициализации которых требуются минуты, похоже, у вас проблема с дизайном. Вы всегда должны иметь возможность написать приложение, чтобы его запуск не занял несколько минут. Возможно, вы могли бы объяснить, почему это занимает так много времени, возможно, есть лучший способ.
Ответ №1:
Ответ №2:
Конечно, просто запустите вспомогательный поток и дайте ему это сделать. Самый простой способ — использовать SingletonHolder и делать все, что вызывает инициализацию во вспомогательном потоке. Другие потоки будут заблокированы, если они попытаются получить к нему доступ до завершения инициализации, так что все работает нормально.
Комментарии:
1. Это ленивая, а не нетерпеливая инициализация.
2. Вы действительно прочитали мой ответ? SingletonHolder означает отложенную инициализацию, доступ к ней немедленно в новом потоке позволяет сделать это как можно скорее. Это все, чего можно достичь, не так ли? — Теперь я вижу, что вы отметили свой вопрос с помощью guice, это меняет ситуацию.
3. Извините, я должен был сделать часть Guice более очевидной в вопросе.