Затмение. Запустите две разные сети, когда вторая читает статическое поле предыдущего
У меня есть проект Java в Eclipse, который разделен на две части; два разных основных класса, которые запускают два разных потока в основном. Один содержит процедуры загрузки, инициализации и отладки, которые выполняются довольно медленно. В то время как другой манипулирует инициализированными данными. Чтобы извлечь информацию из второй части, первая "сохраняет" все ссылки внутри статической карты, которая содержит экземпляры классов.
Существует ли способ запустить первую часть только один раз, а затем скомпилировать и запустить вторую часть еще раз? Я попытался просто установить две разные консоли и нажать кнопку запуска в разное время, но статическое поле первого класса выглядит не существующим, когда запускается второй.
Сейчас я работаю только над второй частью, поэтому мне нужно много раз ее тестировать и запускать. Я действительно ценю помощь, чтобы сэкономить много времени, потраченного на инициализацию одной и той же вещи.
PS: Все работает нормально, если я запускаю обе части вместе. заранее спасибо Лука
благодаря повтору (Multithreader, Stephen C) я пытаюсь прояснить вопрос и спросить, как его решить, поскольку мое решение не выглядит лучшим.....
РЕДАКТИРОВАТЬ 1: "Первая часть" инициализирует программу, а затем запускает простой графический интерфейс, который периодически обновляется. Поэтому, пока он обнаруживается, нам не нужно заботиться о том, как управлять вводом и выводом от пользователя.
РЕДАКТИРОВАТЬ 2: "вторая часть" читает информацию из предыдущего и отправляет обратно строки в графический интерфейс для отладки.
РЕДАКТИРОВАТЬ 3: У меня нет конкретных ограничений в форме проекта, поэтому я могу изменить структуру, если есть лучшие решения. Как и для способа запустить его.
ДАЛЬШЕ ВОПРОС 1: есть ли возможность собрать только одну часть проекта в затмении, пока он выполняется все вместе? Я имею в виду, если два потока запущены, могу ли я остановить один, перекомпилировать его и запустить снова так, чтобы он мог видеть экземпляры, созданные из первого потока, который никогда не останавливается? По сути, мне нужно ссылаться на ту же статическую переменную, загруженную в память, если она существует.
ДАЛЕЕ ВОПРОС 2: или, к счастью, существует способ сохранить и загрузить в файл экземпляры классов Java, избегая записи из эскиза механизма отображения из / в текстовые файлы?
3 ответа
Я думаю, я нашел хитрое решение. Это грязно, но это работает изначально в отладчике затмения.
Я запускаю в режиме отладки основной метод, который создает поток, который работает как вызывающий. Это запускает первую часть проекта и ждет, пока инициализация завершится (обратите внимание, что первая часть здесь не заканчивается, она остается зацикленной для отображения информации об отладке, основанной на статическом классе, который развивается со второй частью программы). Затем он начинается с бесконечного цикла, где он просто вызывает вторую часть, которую я хочу проверить и изменить: здесь также есть точка останова. Что ж, теперь я могу кодировать во второй части, пока отладчик затмения ждет в точке останова, затем сохраняет его и нажимает F8. Отладчик возобновляет работу, алгоритмы запускаются и затем снова останавливаются в точке останова. Просто проверьте, работает ли, со временем что-то измените, затем сохраните и снова нажмите F8, не дожидаясь повторной инициализации первой части проекта.
Вероятно, этот метод должен быть перезапущен через некоторое время, но все же лучше его перезапускать каждый раз:) большое спасибо за вашу помощь. Если у кого-то есть более изящный способ сделать это, они приветствуются!!
Не совсем понятно, что вы спрашиваете здесь, но я предполагаю, что вы говорите о запуске "первой части" и "второй части" в одной и той же JVM ...
Да, это возможно. Но это не так просто.
По сути, вам необходимо провести рефакторинг вашего кода, чтобы появился некий "блок управления", с которым пользователь может взаимодействовать извне. Например, это может быть простой командный цикл, который читает команды из стандартного ввода и запускает их. (В качестве альтернативы вы можете превратить ваше приложение в "службу", которая принимает запросы через сетевой сокет, через RMI, через HTTP и т. Д.)
Затем вы соединяете вещи так, что есть "команда" для запуска "второй части" вашего приложения в ответ на запрос пользователя.
Это основы. Другая вещь, которую вы хотите сделать, это "скомпилировать и запустить вторую часть [много раз]". Это означает, что вам нужно настроить "блок управления", чтобы он мог загрузить свежую копию кода для "второй части" после того, как вы изменили и перекомпилировали его. Для этого вам нужно будет создать новый объект ClassLoader (каждый раз) и использовать его для загрузки классов, составляющих "вторую часть". Это возможно, но немного сложно. Проблемы, которые вам нужно решить, включают:
Разделение "первой части" и "второй части" на отдельные файлы JAR (или деревья каталогов). "Первая часть" должна быть автономной… никаких зависимостей от классов во "второй части".
Убедитесь, что в структурах данных "первой части" отсутствуют ссылки времени выполнения на экземпляры объектов / перечислений во "второй части".
Если вы не поняли вышеприведенное правильно, вы, скорее всего, столкнетесь с утечками памяти "permgen" и таинственными ошибками приведения типов.
В общем, многое нужно сделать, чтобы сделать эту работу. Если вы уже не понимаете всех задействованных технологий, я сомневаюсь, что это сэкономит вам время в целом. Лучшей идеей может быть выяснение, как ускорить инициализацию "первой части"; например, путем ленивой инициализации или кэширования структур данных с использованием некоторого быстрого / легкого механизма сохранения.
Я думаю, что лучше изменить свой дизайн, если не требуется, чтобы он оставался прежним.
Хотя у меня нет требований или того, что вы на самом деле пытаетесь выполнить, я предлагаю вам следующий дизайн: 1. App_1 выполняет вычисления, а затем записывает результаты в файл 2. App_2 считывает проверки для файла, если NOT существует, отображается ошибка сообщение; в противном случае прочитайте файл и продолжайте...