2

全部,

我很欣赏这个网站上的许多有用的答案,但我发现有必要发布我的第一个问题(如果您发现我的帖子中有任何需要改进的地方,请告诉我)。

我有一个大小适中的 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>() {

Sun 的网站上可以找到

使用它我可以进行更新,然后返回 http 交换,但我无法进行另一次更新(按一次使用 SwingWorker 的规定)

然后我尝试SwingWorker根据需要制作多个做类似的事情

private class GUICardUpdate extends SwingWorker<Integer, Void > {

但后来我又回到了原来的问题。我还尝试以这种方式在 GUI 类之外做一个简单的附加线程:

public class GUI extends javax.swing.JFrame implements ActionListener, Runnable

但这也不例外。

也许我对线程的理解不够好,或者我忽略了一些简单的东西。有人有想法么?

谢谢!

4

1 回答 1

1

据我所知,您正在使用javax.smartcardio包(直接或间接)来处理您的卡。某个线程(由您或您可能在其上使用的框架创建javax.smartcardio)在实例上调用beginExclusive()方法Card以确保对卡的独占访问。

独占访问是必要的,因为对保存在 IC 卡上的数据的处理是依赖于状态的,因此正确选择数据文件和读取它们的记录需要应用层的操作不干扰其他应用程序或线程的操作. 为此目的,这三个Card接口方法beginExclusive()endExclusive()checkExclusive()存在。

因此,您应该检查您的(框架)代码是否调用beginExclusive()然后不调用endExclusive().

于 2012-09-26T00:50:07.003 回答