1

我有一个摇摆应用程序。单击菜单栏上的 menuItem 后,我正在尝试进行 API 调用,这可能需要一些时间。

在 API 调用给出结果之前,我不希望 Swing 应用程序卡住/挂起,因此我使用 SwingUtilities.invokeLater 分离出一个新生成的线程来处理 API 调用。以下是上面的代码

public void actionPerformed(ActionEvent e){
    Object src=e.getSource();

    if(src.equals(theJMenuItemClicked)){
        SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        //apicall here
                    }
                })
    }

只要 API 调用线程正常运行,我就会显示一个 JDIalog,其中显示一条消息“API call in Progress”和一个“Abort Thread”按钮。

我想在单击 Jdialog 中的“Abort Thread”按钮时终止该线程。

如果它是一个普通线程,我们有 aThread t = new Thread(new Runnable())并且我们在同一线程上调用 a t.stop

如何获取 SwingUtilities 生成的特定线程实例,以便我可以停止它?用更简单的话来说,我怎样才能杀死上面创建的线程?

4

1 回答 1

0
public class SwingUtilitiesExample implements ActionListener {

// Declaration of Swing Components
private JMenuItem menuItem;
private JButton abortOperation;

// Thread-safe indicator of the presence of the Thread
private volatile boolean isThreadRunning = false;

public SwingUtilitiesExample() {
    // Initialize Swing Components 
    menuItem = new JMenuItem();

    // Add ActionListeners
    menuItem.addActionListener(this);
    abortOperation.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    if (source.equals(menuItem)) {
        isThreadRunning = true;
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                while (isThreadRunning) {
                    // API calls here
                }
            }
        });
    } else if (source.equals(abortOperation)) {
        isThreadRunning = false;
    }
}
}

通过将 的值更改isThreadRunning为 false,您可以有效地中止线程。只要线程定期检查这个布尔值,这段代码就可以正常工作。

该方法Thread.stop()已弃用。Oracle 声明该方法本质上是不安全的。因此,您应该避免使用它。尝试使用线程安全的布尔变量来控制线程的流动,如上面的代码示例所示。

如果您正在考虑在完成 Thread 后返回某种类型,您可能需要考虑SwingWorker该类。

于 2011-10-23T10:26:12.763 回答