首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smartcardio死锁

Smartcardio死锁
EN

Stack Overflow用户
提问于 2014-04-02 16:18:52
回答 1查看 538关注 0票数 0

分析我的应用程序(使用你的工具包),我在java api中看到了一个死锁(冻结了7小时23m 14秒)。

这是分析器打印的内容:

代码语言:javascript
复制
Frozen threads found (potential deadlock)

It seems that the following threads have not changed their stack for more than 10 seconds.
These threads are possibly (but not necessarily!) in a deadlock or hung.

Thread-13 <--- Frozen for at least 7h 23m 14 sec
sun.security.smartcardio.PCSC.SCardListReaders(long)
sun.security.smartcardio.PCSCTerminals.list(CardTerminals$State)
javax.smartcardio.CardTerminals.list()
xxx.xxxxxx.cardreader.CardReader.run()

这就是我如何使用api (我只提取有用的代码)

代码语言:javascript
复制
 public void run() {
    protocolArr = {"T=0", "T=1"}
    while(true) {
        try {
            Thread.sleep(1000);             

            TerminalFactory terminalFactory = TerminalFactory.getDefault();
            List<CardTerminal> terminalList = terminalFactory.terminals().list();   
            for(CardTerminal terminal : terminalList) {
                Card card = null;                   
                // establish a connection with the card
                for(String protocol : protocolArr) {
                    try {
                        card = terminal.connect(protocol);
                        break;
                    } catch(Exception e) {
                    }
                }
                if(card == null)
                    continue;                   
                // The card is valorized                    
                CardChannel channel = card.getBasicChannel();                   
                // SN request
                byte[] byteArr = new byte[5];                   
                // FFh FCh 01h 00h 00h 
                byteArr[0] = (byte) 0xFF;
                byteArr[1] = (byte) 0xFC;
                byteArr[2] = 0x00; // 00h : ATQA + SN + SAK
                byteArr[3] = 0x00;
                byteArr[4] = 0x00;                  
                ResponseAPDU r = channel.transmit(new CommandAPDU(byteArr));                    
                // 44h 03h 04h 26h 47h 09h 48h E8h 10h 20h 90h 00h (example) 
                //      ATQA = 44h 03h 04h 
                //      SN = 26h 47h 09h 48h E8h 10h (7 bytes) 
                //      SAK = 20h                   
                byte[] response = r.getBytes();                 
               // disconnect
                card.disconnect(false);
            }
        } catch(Exception e) {
        }
    }
}

有没有人遇到过这个问题,有没有解决方法?

EN

回答 1

Stack Overflow用户

发布于 2014-04-03 05:12:40

最好使用waitForChange方法,而不是轮询卡片终端。

注意,CardTerminals是从terminalFactory.terminals()返回的,所以在调用list()之前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22805440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档