0 java
我确实需要帮助.为了理解线程是如何工作的,我正在绞尽脑汁.
我想知道这段代码有什么问题?我的应用程序有两个线程.当用户按下按钮A时,一个线程启动,另一个线程在选择B按钮时启动.如果启用了一个按钮,则禁用另一个按钮.
现在,我希望能够在用户尝试退出程序时警告用户线程仍在运行.
代码是....实际上,即使没有任何正在运行的用户无法退出..非常感谢你
exitAction = new AbstractAction("Exit"){
Run Code Online (Sandbox Code Playgroud)public void actionPerformed(ActionEvent e) { Thread thRunning = Thread.currentThread(); if (thRunning.isAlive()) {JOptionPane.showMessageDialog(ProgAu.this,"小心.退出前按STOP","流程运行",JOptionPane.WARNING_MESSAGE);
Run Code Online (Sandbox Code Playgroud)} else { System.exit(0);} } };
- 这是我所指的线索之一......为了检测它的行为,我该怎么做?
class RecThread扩展Thread {
Run Code Online (Sandbox Code Playgroud)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);
Run Code Online (Sandbox Code Playgroud)} catch (Exception e) { showException(e); } playAction.setEnabled(true); stopPlayAction.setEnabled(false); recAction.setEnabled(true); stopRecAction.setEnabled(false); } }
代码有什么问题,它总会警告用户.看这个:
Thread thRunning = Thread.currentThread();
Run Code Online (Sandbox Code Playgroud)
这意味着你正在查看当前正在运行的线程.正在执行该方法调用并继续执行的那个actionPerformed.怎么可能没有运行?这就像有人大声问出说话的人是否已经死了.
当你开始你的另一个线程(无论在哪里)时,你需要保持对该线程的引用...这是你需要测试活跃度的那个.或者(并且最好是IMO)后台线程可以在它们启动时保持递增一些计数器,然后在它们结束时递减它 - 如果计数器为0,则只能退出.这样,如果您的设计更改为允许多个同时后台线程,您无需更改退出检查代码.不要忘记以线程安全的方式执行递增/递减(例如使用AtomicInteger)并确保递减在finally块内,以便即使线程抛出异常而仍然会递减计数器抓住.
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |