全部,
我很欣赏这个网站上的许多有用的答案,但我发现有必要发布我的第一个问题(如果您发现我的帖子中有任何需要改进的地方,请告诉我)。
我有一个大小适中的 Java 程序,它带有 GUI,充当“中间人”和控制器。在信息流的一端,它通过 HTTP 服务器发送和接收数据。另一方面,它与 API 交互,其中数据最终与 SmartCard 交换。“中间”是 GUI、日志记录和其他一些功能。
还有一项功能(通过 GUI 启动)可以偶尔加载 SmartCard 的更新。否则,与智能卡的交换将通过 HTTP 启动。
问题是在这两种模式之间切换时(将 http 与智能卡通信,然后切换到加载更新,反之亦然)。
当我这样做时,我已经得出结论,我遇到了问题
CardException:由另一个线程建立的独占访问
正如抛出的sun.security.smartcardio
在网上搜索显示异常似乎来自的代码是
void checkExclusive() throws CardException {
Thread t = exclusiveThread;
if (t == null) {
return;
}
if (t != Thread.currentThread()) {
throw new CardException("Exclusive access established by another Thread");
}
}
我的第一个想法是我需要在SmartCard API
每次需要时实例化它(然后将其设置回 null),而不是像最初那样为整个程序实例化一次。
这适用于通过 http 进行的交换,我认为这是因为对该handle()
方法的每个请求都是一个新线程。
在 GUI 中,更新由ActionEvent
创建CardUpdate
. 然后在该类中获取SmartCard API
.
我想如果在actionPerformed
触发时我将操作放在不同的临时线程上,我可能会有更好的运气。到目前为止,没有。
我得到的最接近的是使用类似的东西:
SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
使用它我可以进行更新,然后返回 http 交换,但我无法进行另一次更新(按一次使用 SwingWorker 的规定)
然后我尝试SwingWorker
根据需要制作多个做类似的事情
private class GUICardUpdate extends SwingWorker<Integer, Void > {
但后来我又回到了原来的问题。我还尝试以这种方式在 GUI 类之外做一个简单的附加线程:
public class GUI extends javax.swing.JFrame implements ActionListener, Runnable
但这也不例外。
也许我对线程的理解不够好,或者我忽略了一些简单的东西。有人有想法么?
谢谢!