同步块未执行

时间:2018-10-24 08:30:39

标签: java applet synchronized

我有Java Applet,并且从JavaScript运行文件选择方法。
由于安全性不允许这样做,所以我有一个监视boolean标志

的线程
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;
    }
}

我知道肯定可以从javaScript中调用方法Cancel,如果我将其放置在通知窗口中,它将显示出来。但是,取消未由“ Uploader”线程处理,文件继续上传。
我尝试过在没有volatilesynchronized的情况下进行处理,有时可以对其进行处理,但结果不稳定(据我所知,没有volatilesynchronized时是正确的)。

我是Java新手,将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用信号量代替volatile变量,它将可靠地工作。

这是关于挥发物的长话: https://www.ibm.com/developerworks/java/library/j-jtp06197/index.html

以下是信号量的示例代码: https://www.geeksforgeeks.org/semaphore-in-java/