Java Smartcardio死锁

Java Smartcardio死锁,java,api,smartcard,Java,Api,Smartcard,分析我的应用程序(使用yourkit)时,我发现java api中出现了死锁(冻结时间为7小时23米14秒) 这是探查器打印的内容: 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!)

分析我的应用程序(使用yourkit)时,我发现java api中出现了死锁(冻结时间为7小时23米14秒)

这是探查器打印的内容:

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()
发现冻结线程(潜在死锁) 以下线程似乎在10秒以上没有更改堆栈。 这些线程可能(但不一定!)处于死锁或挂起状态。 Thread-13最好使用该方法,而不是轮询卡终端


请注意,
CardTerminals
是从
terminalFactory.terminals()
返回的,因此在调用
list()
之前,谢谢,现在我使用waitForChange来优化代码,但有时我需要循环,因为在我的应用程序中,用户可能会删除并连接到其他pc上的读卡器,因此我需要刷新终端OK,但这不应该是一个需要在发生的微秒内识别的事件。给
waitForChange
一个超时,并检查超时何时结束或事件何时发生。您是否在OS X上的64位Java上使用javax.smartcardio?我在CardTerminals.list()中得到了空的取消引用中断,但也可能发生其他未定义的行为。另见
 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) {
        }
    }
}