当按下按钮时,它陷入无限循环

时间:2019-02-24 17:08:44

标签: java netbeans while-loop rfid

对于我正在尝试的项目,通过按一个按钮并在按下“停止”按钮时放开它,可以使RFID扫描仪一直运行,但是我尝试了一段时间,但问题似乎是,当我按下按钮代码,一切正常,并且确实循环运行,但是按下按钮后,它不允许我再按下其他任何东西,因为它卡在while循环中,有办法将其保持在循环中,但同时用停止按钮停止它。

  @Override
public void start() {

    while (this.flag) {
        try {
            TerminalFactory factory = TerminalFactory.getDefault();
            List<CardTerminal> terminals = factory.terminals().list();
            System.out.println("Terminals: " + terminals);

            CardTerminal terminal = terminals.get(0);

            System.out.println("Waiting for a card..");
            if (terminal == null) {
                return;
            }
            terminal.waitForCardPresent(0);

            Card card = terminal.connect("T=1");
            System.out.println("Card: " + card);
            System.out.println("Protocol: " + card.getProtocol());
            CardChannel channel = card.getBasicChannel();

            ResponseAPDU response = channel.transmit(new CommandAPDU(new byte[]{(byte) 0xFF, (byte) 0xCA, (byte) 0x00, (byte) 0x00, (byte) 0x00}));
            System.out.println("Response: " + response.toString());
            if (response.getSW1() == 0x63 && response.getSW2() == 0x00) {
                System.out.println("Failed");
            }
            System.out.println("UID: " + bin2hex(response.getData()));

            getUid = bin2hex(response.getData());

            Thread.sleep(1000);
        } catch (CardException e) {
            System.out.println();
            JOptionPane.showMessageDialog(null, "Device Not Connected  " + e.getMessage());
        } catch (InterruptedException ex) {
            Logger.getLogger(CardId.class.getName()).log(Level.SEVERE, null, ex);
        }
}
}

以及“开始”按钮

 t = new CardId();
    t.start();

这是我的停止按钮

 t.flag = false;

2 个答案:

答案 0 :(得分:0)

让按钮不断运行,而不是在按下按钮时使Thread循环并在不按下时停止。当Thread到达其所需代码主体的末尾时,it does not execute a second time,即使在调用Thread#start之后。

简而言之,您只需检查循环中的t.flag的值,如果它是false,则可以将线程休眠直到下一次循环。

答案 1 :(得分:0)

第一件事是,如果您使用的是Thread,则应覆盖“ run()”方法。不是“ start()”方法。您仅需要使用“ start()”方法来执行线程。否则,它将使用主线程。没有多线程。

第二件事是,如果“ this.flag”是线程中的实例变量,并且其值是通过按钮操作动态更改的,则该变量应该是可变的。否则,通常将其缓存在循环中。 (more

建议:请遵循良好的设计模式。 (观察员)