我确实需要帮助。 为了理解线程是如何工作的,我正在绞尽脑汁。
我想知道这段代码有什么问题? 我的应用程序有两个线程。当用户按下按钮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); } }
答案 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)
如果当前线程(执行线路的线程)处于活动状态,则检查
你也可以问自己:“我活着吗?”答案很明确(如果你不是僵尸)。