All,
我很欣赏这个网站上的许多有用的答案,但我发现有必要发布我的第一个问题(如果您发现我的帖子中有任何需要改进的地方,请告诉我)。
我有一个中等大小的带有 GUI 的 Java 程序,它充当“中间人”和控制器。在信息流的一端,它通过 HTTP 服务器发送和接收数据。另一方面,它与 API 交互,其中数据最终与智能卡交换。 “中间”是 GUI、日志记录和其他一些功能。
还有一个功能(通过 GUI 启动)偶尔会加载智能卡的更新。否则,与智能卡的交换将通过 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
每次我需要它时(然后将其设置回空),而不是像我最初那样在整个程序中一次。
这适用于通过 http 进行的交换,我认为这是因为每个请求handle()
方法是一个新线程。
在 GUI 中,更新由ActionEvent
这使得一个实例CardUpdate
。然后在该类中获取一个实例SmartCard API
.
我想如果什么时候我也许会有更好的运气actionPerformed
触发我将操作放在不同的临时线程上。到目前为止,没有。
我得到的最接近的是使用类似的东西:
SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
如发现于在 Sun 的网站上 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/simple.html
使用它我可以进行更新,然后返回到 http 交换,但我无法进行另一次更新(根据 SwingWorker 的一次性使用规定)
然后我尝试制作多个SwingWorker
根据需要做类似的事情
private class GUICardUpdate extends SwingWorker<Integer, Void > {
但后来我又回到了原来的问题。我还尝试以这种方式在 GUI 类之外执行一个简单的附加线程:
public class GUI extends javax.swing.JFrame implements ActionListener, Runnable
但这并没有什么不同。
也许我对线程的理解不够好,或者也许我忽略了一些简单的事情。有人有主意吗?
Thanks!