全部,
我在本网站上感谢许多有用的答案,但我发现需要发布我的第一个问题(如果你发现我的帖子中有任何需要改进的地方,请告诉我)。
我有一个适度规模的Java程序,其GUI充当“中间人”和控制器。在信息流的一端,它通过HTTP服务器发送和接收数据。另一方面,它与API进行交互,其中数据最终与智能卡交换。 “中间”是GUI,日志记录和其他一些功能。
还有一项功能(通过GUI启动)偶尔加载SmartCard的更新。否则,通过HTTP启动与SmartCard的交换。
问题是在这两种模式之间切换时(将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
但这没有什么不同。
也许我不太了解线程或者我可能忽略了一些简单的事情。有人有什么想法吗?
谢谢!
答案 0 :(得分:1)
据我所知,您使用javax.smartcardio
包(直接或间接)使用您的卡。某些线程(由您或您可能在javax.smartcardio
之上使用的框架创建)在beginExclusive()
实例上调用Card
方法,以确保对卡的独占访问权限。
独占访问是必要的,因为IC卡上保存的数据的处理是依赖于状态的,因此正确选择数据文件和读取其记录需要应用层的动作不受其他一些行为的干扰。应用程序或线程。为此,存在这三种Card
接口方法beginExclusive()
,endExclusive()
和checkExclusive()
。
因此,如果调用beginExclusive()
,则应检查您的(框架)代码,然后再调用endExclusive()
。