2012-09-25 60 views
2

全部成立,獨家訪問被另一個線程的Java smartcardio

我已經意識到在這個網站許多有用的答案,但我已經找到了需要張貼我的第一個問題(如果你注意到有什麼在我的崗位還有待提高,讓我知道)。

我有一箇中等大小的Java程序,帶有充當「中間人」和控制器的GUI。在信息流的一端,它通過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每次我需要它(然後將其設置回null),而不是像我最初一樣的整個程序。

這適用於通過HTTP的交流與我想,這是因爲每個請求handle()方法是一個新的線程。

在GUI中,更新由ActionEvent啓動,該實例構成CardUpdate的實例。在那個類中,然後獲得SmartCard API的實例。

我想也許我有更好的運氣,如果當actionPerformed觸發我把行動上不同的,暫時的,線程。到目前爲止,沒有。

我用像最近的:

SwingWorker worker = new SwingWorker<ImageIcon[], Void>() { 

截至on Sun's website

發現使用,我可以做一個更新,然後返回到http交流,但我不能這樣做的另一個更新(每SwingWorker類的一次性使用規定)

我又試圖根據需要做這樣的事情

進行多次
private class GUICardUpdate extends SwingWorker<Integer, Void > { 

但後來我又回到了我原來的問題。我也試過,只是做一個簡單的附加線程關閉GUI類以這種方式:

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

但是這並沒有什麼不同。

也許我不太瞭解線程或者我可能忽略了一些簡單的東西。有人有主意嗎?

謝謝!

回答

1

據我所知,您使用javax.smartcardio包(直接或間接)來處理您的卡。某些線程(由您或您可能在javax.smartcardio之上使用的框架創建)在Card實例上調用beginExclusive()方法以確保對卡的獨佔訪問。

獨佔訪問是必要的,因爲對IC卡上保存的數據的處理是狀態依賴的,所以正確選擇數據文件並讀取它們的記錄需要應用層的動作不被某些動作干擾其他應用程序或線程。爲此目的,這三個Card接口方法beginExclusive(),endExclusive()checkExclusive()存在。

所以,你應該檢查你的(框架)代碼,如果它調用beginExclusive()然後不調用endExclusive()

+0

謝謝,這絕對是一個很好的領導,我看到我打電話的框架在哪裏使用開始和結束方法。我將與該框架的開發人員一起工作,看看我能否最終解決問題。 –

+0

約翰,它解決了嗎? –

+0

就我所見,checkExclusive()不是Card Interface的一部分,而是它是CardImpl的一部分,它不可訪問。如果我錯了,請讓我知道。 – planty182

相關問題