2

全て、

このサイトで多くの有益な回答に感謝していますが、最初の質問を投稿する必要があることがわかりました(私の投稿で改善すべき点に気付いた場合はお知らせください)。

私は、「仲介者」およびコントローラーとして機能する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

しかし、これも違いはありません。

スレッドを十分に理解していないか、単純なものを見落としているかもしれません。誰かアイデアはありますか?

ありがとう!

4

1 に答える 1

1

私が得た限り、javax.smartcardioパッケージを(直接的または間接的に)使用してカードを操作しています。カードへの排他的アクセスを確保するために、いくつかのスレッド(あなたまたはおそらく上で使用しているフレームワークによって作成された)がインスタンスでメソッドをjavax.smartcardio呼び出しました。beginExclusive()Card

IC カードに保持されるデータの処理は状態に依存するため、排他的アクセスが必要です。そのため、データ ファイルの適切な選択とその記録の読み取りには、アプリケーション層のアクションが他のアプリケーションまたはスレッドのアクションに干渉されないようにする必要があります。 . この目的のために、これらの 3 つのCardインターフェイス メソッドbeginExclusive()endExclusive()およびcheckExclusive()が存在します。

したがって、(フレームワーク)コードが呼び出されて呼び出さbeginExclusive()れない場合は、コードを確認する必要がありますendExclusive()

于 2012-09-26T00:50:07.003 に答える