У меня есть Java-апплет, и я запускаю метод выбора файлов из JavaScript.
Поскольку безопасность не позволяет этого делать, у меня есть поток, который отслеживает boolean
flag
Thread uploadFilesThread = new Thread(() -> {
try {
while (true) {
synchronized (_UploadFilesSyncObj) {
_UploadFilesSyncObj.wait();
if (uploadFiles) {
uploadFiles = false;
ProcessFiles();
}
}
}
} catch (Exception ex) {
// TODO
}
});
uploadFilesThread.start();
Внутри этого метода я загружаювыбранные файлы.Я хочу иметь логику отмены, и после каждого загруженного файла я проверяю соответствующий флаг.
volatile boolean _CancelRequested = false;
for (JFileInfo fileEntry : _SelectedFilesList) {
try {
synchronized (_CancelSyncObj) {
if (_CancelRequested) {
JOptionPane.showMessageDialog(null, "FOR Cancel Requested");
break;
}
}
...
Метод, который устанавливает флаг:
public void Cancel() {
synchronized (_CancelSyncObj) {
_CancelRequested = true;
}
}
Я знаю, что метод Cancel
точно вызывается из javaScript, и если я добавлю туда окно уведомления, оно будет показано.Однако отмена не обрабатывается потоком «Uploader» и загрузка файлов продолжается.
Я пробовал это без volatile
и без synchronized
, иногда это может быть обработано, но результат не стабилен (и это правильно, насколько я понимаюбез volatile
и synchronized
).
Я новичок в Java и буду благодарен за любые советы.