我有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”线程处理,文件继续上传。
我尝试过在没有volatile
和synchronized
的情况下进行处理,有时可以对其进行处理,但结果不稳定(据我所知,没有volatile
和synchronized
时是正确的)。
我是Java新手,将不胜感激。
答案 0 :(得分:0)
使用信号量代替volatile变量,它将可靠地工作。
这是关于挥发物的长话: https://www.ibm.com/developerworks/java/library/j-jtp06197/index.html
以下是信号量的示例代码: https://www.geeksforgeeks.org/semaphore-in-java/