Я все еще немного новичок в многопоточности, так что, возможно, это простой ответ, но я попытался искать с помощью блокировок и синхронизированных методов, но это не сработало.
У меня есть система, которая подключается к FTP-сайту и загружает XML-файл для обработки. Приложение ожидает обновления файла на сайте ftp, если оно не обновляется, оно ничего не делает. Если он обновляется, он загружает XML-файл, чтобы начать обработку.
Перед обработкой XML мы проверяем версию файла на сервере и версию чего-либо в базе данных, если версии не совпадают, создайте новый поток и обновите файл на сервере до новая версия.
Так что в коде это в значительной степени:
if(file.version.equals(db.version))
{
do work...
}
else
{
startUpdateThread();
}
private synchronized void startUpdateThread()
{
Runnable updateRunnable = new UpdateRunnable();
Thread updateThread = new Thread(updateRunnable);
updateThread.start();
}
Проблема, с которой я столкнулся, заключается в том, что xml-файл изменится на ftp-сайте в процессе обновления файла на сервере и все еще будет вводить метод startUpdateThread (), и к тому времени, когда он будет завершен, у меня будет несколько потоков для выполнения тех же задач.
Мой вопрос, который я предполагаю, состоит в том, почему синхронизированный метод все еще вызывается, даже если он должен быть заблокирован, и если я делаю это неправильно, как правильно подойти к этому, не создавая несколько потоков для выполнения одних и тех же задач.
редактировать
Небольшое дальнейшее объяснение системы: файл на сервере загружается в кеш при запуске приложения, поэтому файл file.version.equals действительно из кеша. Файл нужно обновлять только раз в несколько месяцев. Это делается вручную, и я собираюсь сделать это автоматически.
Файл на сервере и XML-файл не имеют ничего общего друг с другом, просто случается, что эта проверка запускается, когда приложение видит, что файл на сервере изменился (что происходит примерно каждые две минуты). Создание нового файла и загрузка его в кеш занимает около 10 минут. Таким образом, проверка происходит примерно 5 раз, таким образом, создается 5 потоков и создается файл.
Желаемый результат:
Обычная обработка для продолжения работы с xml-файлом
ОДИН новый поток создается для перезагрузки полностью отдельного файла на сервере.
Надеюсь, это имеет смысл ...