线程检查问题

时间:2011-01-12 17:17:00

标签: java

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

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

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

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

  

exitAction = new   AbstractAction(“退出”){

        public void actionPerformed(ActionEvent e) {

          Thread thRunning = Thread.currentThread();


        if (thRunning.isAlive()) {
     

JOptionPane.showMessageDialog(ProgAu.this,   “小心。先按下STOP   退出”,                       “正在运行”,JOptionPane.WARNING_MESSAGE);

    }
     else {

            System.exit(0);}

        }
    };

- 这是我所指的线索之一...... 我该怎么做才能发现它的行为?

  

class RecThread扩展了线程{

    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),
     

fileType,recFile);

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


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




    }
}

5 个答案:

答案 0 :(得分:8)

代码的错误在于总是警告用户。看看这个:

Thread thRunning = Thread.currentThread();

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

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

答案 1 :(得分:1)

Thread.currentThread()是不是指你的GUI线程?因此,它将永远活着。

答案 2 :(得分:1)

当前线程始终存在。如果它已经死了,它将运行代码来检查它是否还活着。也许您打算将另一个线程保存在字段中并检查它是否还活着?

答案 3 :(得分:1)

Thread.CurrentThread()。IsAlive()ALWAYS返回true,因为您正在查询运行代码的线程的状态,并进行检查。在创建工作线程时,您需要保留工作线程的句柄,并在此方法中查询THEIR状态。

答案 4 :(得分:0)

如果当前线程(执行线路的线程)处于活动状态,则检查

你也可以问自己:“我活着吗?”答案很明确(如果你不是僵尸)。