杀死SwingUtilities.invokeLater()中的一个线程

时间:2011-05-13 12:03:50

标签: multithreading swing swingutilities

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

我不想让Swing应用程序卡住/挂起,直到API调用给出结果,所以我使用了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调用”和“中止线程”按钮。

我想点击Jdialog中的“ABort Thread”按钮来杀死该线程。

如果它是普通线程,我们有一个Thread t = new Thread(new Runnable()),我们就会调用t.stop

如何获取由SwingUtilities产生的特定线程实例,以便我可以在其上调用停止?用简单的话来说,如何杀死上面创建的线程?

1 个答案:

答案 0 :(得分: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定期检查此布尔值,此代码就可以正常运行。

不推荐使用方法Thread.stop()。 Oracle声明the method is inherently unsafe。因此,您应该避免使用它。尝试使用线程安全的布尔变量来控制线程的流程,如上面的代码示例所示。

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