线程检查问题

0 java

我确实需要帮助.为了理解线程是如何工作的,我正在绞尽脑汁.

我想知道这段代码有什么问题?我的应用程序有两个线程.当用户按下按钮A时,一个线程启动,另一个线程在选择B按钮时启动.如果启用了一个按钮,则禁用另一个按钮.

现在,我希望能够在用户尝试退出程序时警告用户线程仍在运行.

代码是....实际上,即使没有任何正在运行的用户无法退出..非常感谢你

exitAction = new AbstractAction("Exit"){

        public void actionPerformed(ActionEvent e) {

          Thread thRunning = Thread.currentThread();


        if (thRunning.isAlive()) {
Run Code Online (Sandbox Code Playgroud)

JOptionPane.showMessageDialog(ProgAu.this,"小心.退出前按STOP","流程运行",JOptionPane.WARNING_MESSAGE);

    }
     else {

            System.exit(0);}

        }
    };
Run Code Online (Sandbox Code Playgroud)

- 这是我所指的线索之一......为了检测它的行为,我该怎么做?

class RecThread扩展Thread {

    public void run() {

        recFile = new File("rec.wav");

        AudioFileFormat.Type fileType = null;
        fileType = AudioFileFormat.Type.WAVE;



        try {

            targetDataLine.open(audioFormat);


            targetDataLine.start();


            AudioSystem.write(new AudioInputStream(targetDataLine),
Run Code Online (Sandbox Code Playgroud)

fileType,recFile);

        } catch (Exception e) {
            showException(e);
        }


        playAction.setEnabled(true);
        stopPlayAction.setEnabled(false);
  recAction.setEnabled(true);
        stopRecAction.setEnabled(false);  




    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

代码有什么问题,它总会警告用户.看这个:

Thread thRunning = Thread.currentThread();
Run Code Online (Sandbox Code Playgroud)

这意味着你正在查看当前正在运行的线程.正在执行该方法调用并继续执行的那个actionPerformed.怎么可能没有运行?这就像有人大声问出说话的人是否已经死了.

当你开始你的另一个线程(无论在哪里)时,你需要保持对该线程的引用...这是你需要测试活跃度的那个.或者(并且最好是IMO)后台线程可以在它们启动时保持递增一些计数器,然后在它们结束时递减它 - 如果计数器为0,则只能退出.这样,如果您的设计更改为允许多个同时后台线程,您无需更改退出检查代码.不要忘记以线程安全的方式执行递增/递减(例如使用AtomicInteger)并确保递减在finally块内,以便即使线程抛出异常而仍然会递减计数器抓住.