gpt4 book ai didi

java - 由另一个 Thread Java smartcardio 建立的独占访问

转载 作者:行者123 更新时间:2023-11-30 11:40:44 26 4
gpt4 key购买 nike

全部,

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

我有一个中等大小的带有 GUI 的 Java 程序,它充当“中间人”和 Controller 。在信息流的一端,它通过 HTTP 服务器发送和接收数据。另一方面,它与 API 交互,其中数据最终与智能卡交换。 “中间”是 GUI、日志记录和其他一些功能。

还有一个功能(通过 GUI 启动)偶尔加载智能卡更新。否则通过 HTTP 启动与智能卡的交换。

问题是在这两种模式之间切换时(将 http 通信到智能卡然后切换到加载更新,反之亦然)。

当我这样做时,我得出结论,我遇到了问题

CardException: Exclusive access established by another Thread

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>() {

on Sun's website 找到

使用它我可以进行更新然后返回到 http 交换但我不能进行另一次更新(根据 SwingWorker 的一次使用规定)

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

private class GUICardUpdate extends SwingWorker<Integer, Void > {

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

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

但这也不异常(exception)。

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

谢谢!

最佳答案

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

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

因此,您应该检查您的(框架)代码是否调用了 beginExclusive() 而没有调用 endExclusive()

关于java - 由另一个 Thread Java smartcardio 建立的独占访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12592634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com