Синхронизированный блок не выполнен - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 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 и буду благодарен за любые советы.

1 Ответ

0 голосов
/ 24 октября 2018

Используйте семафор вместо переменной volatile, и он будет работать надежно.

Вот длинный рассказ о летучих веществах: https://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

Вот пример кода для семафоров: https://www.geeksforgeeks.org/semaphore-in-java/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...