全て、
このサイトで多くの有益な回答に感謝していますが、最初の質問を投稿する必要があることがわかりました(私の投稿で改善すべき点に気付いた場合はお知らせください)。
私は、「仲介者」およびコントローラーとして機能するGUIを備えた適度なサイズのJavaプログラムを持っています。情報フローの一方の端で、HTTPサーバーを介してデータを送受信します。一方、APIと相互作用しており、データは最終的にスマートカードと交換されます。「中央」には、GUI、ロギング、およびその他のいくつかの機能があります。
SmartCardの更新をときどきロードする機能(GUIを介して開始)もあります。それ以外の場合、スマートカードとの交換はHTTPを介して開始されます。
問題は、これら2つのモードを切り替える場合です(httpをスマートカードに通信してからアップデートのロードに切り替えるか、またはその逆)。
私がそうするとき、私は次の問題にぶつかると結論付けました
CardException:別のスレッドによって確立された排他的アクセス
によって投げられるようにsun.security.smartcardio
Webを検索すると、例外が発生しているように見えるコードが表示されます。
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
最初に持っていたようにプログラム全体に対して1回ではなく、必要になるたびにインスタンス化する(そしてnullに戻す)必要があるということでした。
これはhttpを介した交換で機能します。これは、handle()
メソッドへの各リクエストが新しいスレッドであるためだと思います。
GUIでは、更新はActionEvent
のインスタンスを作成するによって開始されますCardUpdate
。そのクラス内で、のインスタンスを取得しますSmartCard API
。
actionPerformed
トリガーされたときにアクションを別の一時的なスレッドに配置すると、運が良かったのではないかと思いました。これまでのところ、違います。
私が得た最も近いものは、次のようなものを使用していました:
SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
サンのウェブサイトで見つけたように
それを使用して、更新を実行してからhttp交換に戻ることはできましたが、別の更新を実行することはできませんでした(SwingWorkerの1回の使用規定による)
次に、必要に応じて複数SwingWorker
を作成して、次のようなことを試みました。
private class GUICardUpdate extends SwingWorker<Integer, Void > {
しかし、その後、元の問題に戻りました。また、次の方法でGUIクラスから単純な追加スレッドを実行しようとしました。
public class GUI extends javax.swing.JFrame implements ActionListener, Runnable
しかし、これも違いはありません。
スレッドを十分に理解していないか、単純なものを見落としているかもしれません。誰かアイデアはありますか?
ありがとう!